So benennen Sie den JSON-Schlüssel um


75

Ich habe ein JSON-Objekt mit folgendem Inhalt:

[
  {
    "_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"
  }
]

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

[
  {
    "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"
  }
]

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

Vielen Dank.


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":"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 );


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\":");

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":"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));

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.


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":"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);

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":"user1@gmail.com","image":"some_image_url","name":"Name 1"},{"_id":"2","email":"user2@gmail.com","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.


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

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":"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)

Ausgabe:

[{"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"}]

3

Wenn Ihr Objekt so aussieht:

obj = {
    "_id":"5078c3a803ff4197dc81fbfb",
    "email":"user1@gmail.com",
    "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":"user1@gmail.com",
    "image":"some_image_url",
    "name":"Name 1"
   }

2

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

var userDetails = [{
  "_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"
}];

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

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.


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
  }
]
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.