92 votes

Comment renommer une clé JSON

J'ai un objet JSON avec le contenu suivant :

[
  {
    "_id":"5078c3a803ff4197dc81fbfb",
    "email":"user1@gmail.com",
    "image":"some_image_url",
    "name":"Name 1"
  },
  {
    "_id":"5078c3a803ff4197dc81fbfc",
    "email":"user2@gmail.com",
    "image":"some_image_url",
    "name":"Name 2"
  }
]

Je veux changer la clé "_id" en "id" pour qu'elle devienne

[
  {
    "id":"5078c3a803ff4197dc81fbfb",
    "email":"user1@gmail.com",
    "image":"some_image_url",
    "name":"Name 1"
  },
  {
    "id":"5078c3a803ff4197dc81fbfc",
    "email":"user2@gmail.com",
    "image":"some_image_url",
    "name":"Name 2"
  }
]

Comment pourrais-je faire ça avec Javascript, jQuery ou Ruby, Rails ?

Gracias.

110voto

Paulpro Points 54844
  1. Analyser le JSON

    const arr = JSON.parse(json);

  2. Pour chaque objet dans le JSON, renommez la clé :

    obj.id = obj._id; delete obj._id;

  3. Stringify le résultat

Tous ensemble :

function renameKey ( obj, oldKey, newKey ) {
  obj[newKey] = obj[oldKey];
  delete obj[oldKey];
}

const json = `
  [
    {
      "_id":"5078c3a803ff4197dc81fbfb",
      "email":"user1@gmail.com",
      "image":"some_image_url",
      "name":"Name 1"
    },
    {
      "_id":"5078c3a803ff4197dc81fbfc",
      "email":"user2@gmail.com",
      "image":"some_image_url",
      "name":"Name 2"
    }
  ]
`;

const arr = JSON.parse(json);
arr.forEach( obj => renameKey( obj, '_id', 'id' ) );
const updatedJson = JSON.stringify( arr );

console.log( updatedJson );

28voto

evanmcdonnal Points 11407

Dans ce cas, le plus simple serait d'utiliser le remplacement de chaînes de caractères. La sérialisation du JSON ne fonctionnera pas bien car _id deviendra le nom de la propriété de l'objet et changer le nom d'une propriété n'est pas une tâche simple (du moins pas dans la plupart des langages, ce n'est pas si mal en javascript). Au lieu de cela, il suffit de faire ;

jsonString = jsonString.replace("\"_id\":", "\"id\":");

24voto

Udhayakumar Points 899

Comme mentionné par evanmcdonnal La solution la plus simple est de traiter ces données comme des chaînes de caractères au lieu de JSON,

var json = [{"_id":"5078c3a803ff4197dc81fbfb","email":"user1@gmail.com","image":"some_image_url","name":"Name 1"},{"_id":"5078c3a803ff4197dc81fbfc","email":"user2@gmail.com","image":"some_image_url","name":"Name 2"}];

json = JSON.parse(JSON.stringify(json).split('"_id":').join('"id":'));

document.write(JSON.stringify(json));

Cela convertira les données JSON données en chaîne de caractères et remplacera "_id" par "id", puis les reconvertira au format JSON requis. Mais j'ai utilisé split y join au lieu de replace parce que replace ne remplacera que la première occurrence de la chaîne.

13voto

user7246161 Points 39

Essayez ça :

let jsonArr = [
    {
        "_id":"5078c3a803ff4197dc81fbfb",
        "email":"user1@gmail.com",
        "image":"some_image_url",
        "name":"Name 1"
    },
    {
        "_id":"5078c3a803ff4197dc81fbfc",
        "email":"user2@gmail.com",
        "image":"some_image_url",
        "name":"Name 2"
    }
]

let idModified = jsonArr.map(
    obj => {
        return {
            "id" : obj._id,
            "email":obj.email,
            "image":obj.image,
            "name":obj.name
        }
    }
);
console.log(idModified);

11voto

Pylon Points 348

JSON.parse a deux paramètres. Le deuxième paramètre, reviver, est une fonction de transformation qui peut formater le format de sortie que nous voulons. Voir la spécification de l'ECMA aquí .

En fonction reviver :

  • si nous retournons undefined, la propriété originale sera supprimée.
  • this est l'objet contenant la propriété traitée par cette fonction, et le nom de la propriété sous forme de chaîne, la valeur de la propriété comme arguments de cette fonction.

    const json = '[{"_id":"5078c3a803ff4197dc81fbfb","email":"user1@gmail.com","image":"some_image_url","name":"Name 1"},{"_id":"5078c3a803ff4197dc81fbfc","email":"user2@gmail.com","image":"some_image_url","name":"Name 2"}]';

    const obj = JSON.parse(json, function(k, v) { if (k === "_id") { this.id = v; return; // if return undefined, orignal property will be removed } return v; });

    const res = JSON.stringify(obj); console.log(res)

sortie :

[{"email":"user1@gmail.com","image":"some_image_url","name":"Name 1","id":"5078c3a803ff4197dc81fbfb"},{"email":"user2@gmail.com","image":"some_image_url","name":"Name 2","id":"5078c3a803ff4197dc81fbfc"}]

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X