89

次の内容の 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"
  }
]

「_id」キーを「id」に変更したいので、

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

Javascript、jQuery、または Ruby、Rails のいずれかでそれを行うにはどうすればよいですか?

ありがとう。

4

13 に答える 13

109
  1. JSON を解析する
const arr = JSON.parse(json);
  1. JSON 内のオブジェクトごとに、キーの名前を変更します。
obj.id = obj._id;
delete obj._id;
  1. 結果を文字列化する

すべて一緒に:

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

于 2012-11-15T04:32:57.470 に答える
28

この場合、文字列置換を使用するのが最も簡単です。_id がオブジェクトのプロパティ名になり、プロパティ名を変更するのは簡単な作業ではないため、JSON のシリアル化はうまくいきません (少なくともほとんどの言語ではそうではありませんが、javascript ではそれほど悪くはありません)。代わりに行うだけです。

jsonString = jsonString.replace("\"_id\":", "\"id\":");
于 2012-11-15T04:31:57.607 に答える
24

evanmcdonnalが述べたように、最も簡単な解決策は、これを 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));

これにより、指定された JSON データが文字列に変換され、「_id」が「id」に置き換えられてから、必要な JSON 形式に変換されます。ただし、文字列の最初の出現のみを置き換えるため、代わりにsplitandを使用しました。joinreplacereplace

于 2016-03-16T08:11:06.447 に答える
9

JSON.parseには 2 つのパラメーターがあります。2 番目のパラメーター reviver は、必要な出力形式をフォーマットできる変換関数です。ここでECMA 仕様を参照してください。

リバイバー機能で:

  • undefined を返すと、元のプロパティは削除されます。
  • thisこの関数として処理されるプロパティを含むオブジェクトで、文字列としてのプロパティ名、この関数の引数としてのプロパティ値です。
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)

出力:

[{"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"}]
于 2019-12-04T12:19:14.827 に答える
0

これを試して

function renameKey ( obj, oldKey, newKey ) {
  obj[newKey] = obj[oldKey];
  delete obj[oldKey];
}
于 2021-08-17T11:08:02.043 に答える