So benennen Sie den JSON-Schlüssel um

75

Ich habe ein JSON-Objekt mit folgendem Inhalt:

[
  {
    "_id":"5078c3a803ff4197dc81fbfb",
    "email":"[email protected]",
    "image":"some_image_url",
    "name":"Name 1"
  },
  {
    "_id":"5078c3a803ff4197dc81fbfc",
    "email":"[email protected]",
    "image":"some_image_url",
    "name":"Name 2"
  }
]

Ich möchte den Schlüssel "_id" in "id" ändern, damit er wird

[
  {
    "id":"5078c3a803ff4197dc81fbfb",
    "email":"[email protected]",
    "image":"some_image_url",
    "name":"Name 1"
  },
  {
    "id":"5078c3a803ff4197dc81fbfc",
    "email":"[email protected]",
    "image":"some_image_url",
    "name":"Name 2"
  }
]

Wie würde ich das entweder mit Javascript, jQuery oder Ruby, Rails machen?

Vielen Dank.

duy
quelle
4
Analysieren Sie den JSON, ändern Sie die resultierende Datenstruktur entsprechend und konvertieren Sie sie zurück in JSON. Zeiger: stackoverflow.com/questions/4935632/… , stackoverflow.com/questions/1826727/… , stackoverflow.com/questions/2295496/… , stackoverflow.com/questions/3183786/… .
Felix Kling

Antworten:

97
  1. Analysieren Sie den JSON
const arr = JSON.parse(json);
  1. Benennen Sie den Schlüssel für jedes Objekt in JSON um:
obj.id = obj._id;
delete obj._id;
  1. Stringifizieren Sie das Ergebnis

Alle zusammen:

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

const json = `
  [
    {
      "_id":"5078c3a803ff4197dc81fbfb",
      "email":"[email protected]",
      "image":"some_image_url",
      "name":"Name 1"
    },
    {
      "_id":"5078c3a803ff4197dc81fbfc",
      "email":"[email protected]",
      "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 );

Paul
quelle
5
Was ist, wenn ich die Änderung auf alle _id in json anwenden möchte?
Truongnm
1
@ Truongnm Schleife es
Viswanath Lekshmanan
2
auch wenn Sie Schlüssel mit Leerzeichen haben möchten, können Sie es wie folgt hinzufügen obj ["my id"] = obj.id
catchiecop
27

In diesem Fall ist es am einfachsten, String Replace zu verwenden. Das Serialisieren des JSON funktioniert nicht gut, da _id zum Eigenschaftsnamen des Objekts wird und das Ändern eines Eigenschaftsnamens keine einfache Aufgabe ist (zumindest nicht in den meisten Sprachen, es ist in Javascript nicht so schlecht). Stattdessen einfach tun;

jsonString = jsonString.replace("\"_id\":", "\"id\":");
evanmcdonnal
quelle
2
Und was ist, wenn er Parameter hat "whereToFindIdentification":"id"? Es ist nie der beste Weg.
Kamil
22

Wie von evanmcdonnal erwähnt , besteht die einfachste Lösung darin, dies als Zeichenfolge anstelle von JSON zu verarbeiten.

var json = [{"_id":"5078c3a803ff4197dc81fbfb","email":"[email protected]","image":"some_image_url","name":"Name 1"},{"_id":"5078c3a803ff4197dc81fbfc","email":"[email protected]","image":"some_image_url","name":"Name 2"}];
    
json = JSON.parse(JSON.stringify(json).split('"_id":').join('"id":'));

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

Dadurch werden die angegebenen JSON-Daten in Zeichenfolgen konvertiert und "_id" in "id" ersetzt. Anschließend werden sie wieder in das erforderliche JSON-Format konvertiert. Aber ich habe splitund joinstattdessen verwendet replace, weil replacenur das erste Vorkommen der Zeichenfolge ersetzt wird.

Fremder
quelle
1
Vielen Dank, Herr Fremder. Es hilft mir wirklich.
Chetan S. Choudhary
1
Sauber, kurz und gut erklärt. Toll!
Andreas
10

Versuche dies:

let jsonArr = [
    {
        "_id":"5078c3a803ff4197dc81fbfb",
        "email":"[email protected]",
        "image":"some_image_url",
        "name":"Name 1"
    },
    {
        "_id":"5078c3a803ff4197dc81fbfc",
        "email":"[email protected]",
        "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);
user7246161
quelle
5

Wenn Sie alle Vorkommen eines Schlüssels umbenennen möchten, können Sie einen regulären Ausdruck mit der Option g verwenden. Zum Beispiel:

var json = [{"_id":"1","email":"[email protected]","image":"some_image_url","name":"Name 1"},{"_id":"2","email":"[email protected]","image":"some_image_url","name":"Name 2"}];

str = JSON.stringify(json);

jetzt haben wir den json im string format in str.

Ersetzen Sie alle Vorkommen von "_id" durch Regex durch "id" durch die Option g :

str = str.replace(/\"_id\":/g, "\"id\":");

und kehren Sie zum JSON-Format zurück:

json = JSON.parse(str);

Jetzt haben wir unseren JSON mit dem gewünschten Schlüsselnamen.

RefaelJan
quelle
3
Dies funktioniert nicht, wenn irgendwo ein Wert vorhanden ist, der den zu ersetzenden Schlüsselnamen enthält, da dieser ebenfalls ersetzt wird.
Carasel
Guter Punkt, aber Randfall.
Seien Sie
3

Ist mit typeScript möglich

function renameJson(json,oldkey,newkey) {    
 return Object.keys(json).reduce((s,item) => 
      item == oldkey ? ({...s,[newkey]:json[oldkey]}) : ({...s,[item]:json[item]}),{})   
}

Beispiel: https://codepen.io/lelogualda/pen/BeNwWJ

Aurelio Gualda
quelle
3

JSON.parsehat zwei Parameter. Der zweite Parameter, reviver, ist eine Transformationsfunktion, die als gewünschtes Ausgabeformat formatiert werden kann. Siehe ECMA-Spezifikation hier .

In der Reviver-Funktion:

  • Wenn wir undefiniert zurückgeben, wird die ursprüngliche Eigenschaft gelöscht.
  • this ist das Objekt, das die Eigenschaft enthält, die als diese Funktion verarbeitet wird, und der Eigenschaftsname als Zeichenfolge, der Eigenschaftswert als Argumente dieser Funktion.
const json = '[{"_id":"5078c3a803ff4197dc81fbfb","email":"[email protected]","image":"some_image_url","name":"Name 1"},{"_id":"5078c3a803ff4197dc81fbfc","email":"[email protected]","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)

Ausgabe:

[{"email":"[email protected]","image":"some_image_url","name":"Name 1","id":"5078c3a803ff4197dc81fbfb"},{"email":"[email protected]","image":"some_image_url","name":"Name 2","id":"5078c3a803ff4197dc81fbfc"}]
Pylon
quelle
3

Wenn Ihr Objekt so aussieht:

obj = {
    "_id":"5078c3a803ff4197dc81fbfb",
    "email":"[email protected]",
    "image":"some_image_url",
    "name":"Name 1"
   }

Die wahrscheinlich einfachste Methode in JavaScript ist:

obj.id = obj._id
del object['_id']

Als Ergebnis erhalten Sie:

obj = {
    "id":"5078c3a803ff4197dc81fbfb",
    "email":"[email protected]",
    "image":"some_image_url",
    "name":"Name 1"
   }
trojek
quelle
2

Mit der Kartenfunktion können Sie das tun. Bitte beziehen Sie sich auf den folgenden Code.

var userDetails = [{
  "_id":"5078c3a803ff4197dc81fbfb",
  "email":"[email protected]",
  "image":"some_image_url",
  "name":"Name 1"
},{
  "_id":"5078c3a803ff4197dc81fbfc",
  "email":"[email protected]",
  "image":"some_image_url",
  "name":"Name 2"
}];

var formattedUserDetails = userDetails.map(({ _id:id, email, image, name }) => ({
  id,
  email,
  image,
  name
}));
console.log(formattedUserDetails);
Jitendra Pawar
quelle
1

Wenn jemand dies dynamisch tun muss:

const keys = Object.keys(jsonObject);

keys.forEach((key) => {

      // CREATE A NEW KEY HERE
      var newKey = key.replace(' ', '_');

      jsonObject[newKey] = jsonObject[key];
      delete jsonObject[key];
   });

jsonObject wird jetzt die neuen Schlüssel haben.

WICHTIG:

Wenn Ihr Schlüssel von der replaceFunktion nicht geändert wird , wird er einfach aus dem Array entfernt. Vielleicht möchten Sie dort einige ifAussagen einfügen.

LukeVenter
quelle
0

Wenn Sie dies beispielsweise dynamisch ausführen möchten, verfügen Sie über ein Array, das Sie als Schlüssel auf das JSON-Objekt anwenden möchten:

Ihr Array wird wie folgt aussehen:

var keys = ["id", "name","Address","Phone"] // The array size should be same as JSON Object keys size

Jetzt haben Sie ein JSON-Array wie:

var jArray = [
  {
    "_id": 1,
    "_name": "Asna",
    "Address": "NY",
    "Phone": 123
  },
  {
    "_id": 2,
    "_name": "Euphoria",
    "Address": "Monaco",
    "Phone": 124
  },
  {
    "_id": 3,
    "_name": "Ahmed",
    "Address": "Mumbai",
    "Phone": 125
  }
]

$.each(jArray ,function(pos,obj){
    var counter = 0;
    $.each(obj,function(key,value){
        jArray [pos][keys[counter]] = value;
        delete jArray [pos][key];
        counter++;
    })  
})

Ihr resultierendes JSON-Array sieht folgendermaßen aus:

[
  {
    "id": 1,
    "name": "Asna",
    "Address": "NY",
    "Phone": 123
  },
  {
    "id": 2,
    "name": "Euphoria",
    "Address": "Monaco",
    "Phone": 124
  },
  {
    "id": 3,
    "name": "Ahmed",
    "Address": "Mumbai",
    "Phone": 125
  }
]
Sufiyan Ansari
quelle