Як перейменувати ключ JSON


76

У мене є об’єкт 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
Проаналізуйте JSON, відповідно змініть отриману структуру даних і перетворіть її назад у JSON. Покажчики: stackoverflow.com/questions/4935632/… , stackoverflow.com/questions/1826727/… , stackoverflow.com/questions/2295496/… , stackoverflow.com/questions/3183786/… .
Фелікс Клінг,

Відповіді:


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


5
що, якщо я хочу застосувати зміни до всіх _id в json?
truongnm

1
@truongnm loop it
Viswanath Lekshmanan

2
також якщо ви хочете мати ключі з пробілами, ви можете додати його таким чином obj ["мій ідентифікатор"] = obj.id
catchiecop

27

У цьому випадку було б найпростіше скористатися заміною рядка. Серіалізація JSON не буде працювати добре, оскільки _id стане ім'ям властивості об'єкта, а зміна імені властивості не є простим завданням (принаймні не в більшості мов, це не так погано в javascript). Натомість просто робіть;

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

2
А що, якщо у нього будуть параметри "whereToFindIdentification":"id"? це ніколи не найкращий спосіб.
Каміль

22

Як згадував 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. Але я використовував splitі joinзамість replace, тому що replaceзамінить лише перше входження рядка.


1
Велике спасибі містере Незнайомець, це справді мені допомагає.
Chetan S. Choudhary

1
Чисто, коротко і добре пояснено. Чудово!
Андреас,

12

Спробуйте це:

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

Якщо ви хочете перейменувати всі входження деяких ключів, ви можете використовувати регулярний вираз із параметром g. Наприклад:

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

тепер у нас є json у форматі рядка в str.

Замініть усі випадки "_id" на "id", використовуючи регулярний вираз, опцією g :

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

і повернутися до формату json:

json = JSON.parse(str);

тепер у нас є наш json з потрібною назвою ключа.


3
Це не спрацює, якщо десь є значення, що містить ім’я ключа, яке ви замінюєте, оскільки воно також замінить це.
Карасель

Хороший момент, але крайовий випадок. Завжди потрібно бути обережним при заміні тексту
RefaelJan


3

За допомогою функції map ви можете це зробити. Будь ласка, зверніться до коду нижче.

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

3

JSON.parseмає два параметри. Другий параметр, відроджувач, - це функція перетворення, яка може бути відформатована у вихідному форматі, який ми хочемо. Дивіться специфікацію ECMA тут .

У функції відновлення:

  • якщо ми повернемо невизначене, оригінальне властивість буде видалено.
  • 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"}]

3

Якщо ваш об’єкт виглядає так:

obj = {
    "_id":"5078c3a803ff4197dc81fbfb",
    "email":"user1@gmail.com",
    "image":"some_image_url",
    "name":"Name 1"
   }

Ймовірно, найпростіший метод у JavaScript:

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

В результаті ви отримаєте:

obj = {
    "id":"5078c3a803ff4197dc81fbfb",
    "email":"user1@gmail.com",
    "image":"some_image_url",
    "name":"Name 1"
   }

1

Якщо комусь потрібно робити це динамічно:

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 тепер матимуть нові ключі.

ВАЖЛИВО:

Якщо ваш ключ не змінено replaceфункцією, вона просто виведе його з масиву. Можливо, ви захочете помістити туди деякі ifзаяви.


0

Наприклад, якщо ви хочете зробити це динамічно, у вас є масив, який ви хочете застосувати як ключ до об'єкта JSON:

ваш масив буде таким:

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

Тепер у вас є масив JSON, такий як:

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

Ваш отриманий масив JSON буде таким:

[
  {
    "id": 1,
    "name": "Asna",
    "Address": "NY",
    "Phone": 123
  },
  {
    "id": 2,
    "name": "Euphoria",
    "Address": "Monaco",
    "Phone": 124
  },
  {
    "id": 3,
    "name": "Ahmed",
    "Address": "Mumbai",
    "Phone": 125
  }
]
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.