Добавление нового элемента массива в объект JSON

120

У меня есть объект формата JSON, который я прочитал из файла JSON, который у меня есть в переменной с именем teamJSON, который выглядит следующим образом:

 {"theTeam":[{"teamId":"1","status":"pending"},{"teamId":"2","status":"member"},{"teamId":"3","status":"member"}]}

Я хочу добавить в массив новый элемент, например

{"teamId":"4","status":"pending"}

закончить с

{"theTeam":[{"teamId":"1","status":"pending"},{"teamId":"2","status":"member"},{"teamId":"3","status":"member"},{"teamId":"4","status":"pending"}]}

перед записью в файл. Как лучше всего добавить новый элемент? Я подошел близко, но все двойные кавычки исчезли. Я искал хороший ответ по SO, но ни один из них полностью не охватил этот случай. Любая помощь приветствуется.

Чарльз Вайк-Смит
источник
6
yourObj.theTeam.push({"teamId":"4","status":"pending"});
PSL
2
«JSON» - это не объект - это обозначение.
Брэд Кристи
1
Когда вы читаете объект JSON из файла, интерпретируется ли он как JSON или строка? Если это строка, вам нужно сначала проанализировать строку как JSON, тогда вы можете сделать то, что предлагают другой комментарий и ответ.
Марк
3
@Charles прочитал ваш заголовок, а затем еще раз изучил свой комментарий.
Брэд Кристи
1
@ CharlesWyke-Smith Какого типа ваша teamJSONпеременная? Это строка JSON, то '{"theTeam":[...]}'есть фактический литерал объекта? Подсказка: используйтеconsole.log(typeof teamJSON)
Фил

Ответы:

234

JSON - это просто обозначение ; чтобы внести нужное изменение, parseчтобы вы могли применить изменения к собственному объекту JavaScript , а затем stringifyобратно к JSON

var jsonStr = '{"theTeam":[{"teamId":"1","status":"pending"},{"teamId":"2","status":"member"},{"teamId":"3","status":"member"}]}';

var obj = JSON.parse(jsonStr);
obj['theTeam'].push({"teamId":"4","status":"pending"});
jsonStr = JSON.stringify(obj);
// "{"theTeam":[{"teamId":"1","status":"pending"},{"teamId":"2","status":"member"},{"teamId":"3","status":"member"},{"teamId":"4","status":"pending"}]}"
Пол С.
источник
16
+1 за указание на то, что нужно сначала проанализировать объект, которым нужно манипулировать.
Брэд Кристи
3
Он сказал, что у него уже есть объект в переменной с именем teamJSON. Ни в коем случае не упоминается строка
Фил
6
@Phil: Если это JSON, это строка. Если нет, то это не JSON.
user2736012
1
Экранированные кавычки на самом деле заставляют меня задуматься, был ли JSON закодирован дважды.
user2736012
24
Пол, это очень конструктивный ответ. Он устраняет недостатки в постановке задачи, не умаляя при этом значения оригинального плаката. Он более четко очерчивает границы между работой с объектами javascript и текстовым представлением этих объектов JSON. Я думаю, это важно для понимания того, что после анализа JSON мы работаем с чистыми объектами javascript - тот факт, что они изначально были получены из JSON, не имеет значения. В любом случае, чтение вашего ответа было глотком свежего воздуха после всех унизительных комментариев, из-за которых ОП чувствовал себя идиотом.
Ларри Гектор
20
var Str_txt = '{"theTeam":[{"teamId":"1","status":"pending"},{"teamId":"2","status":"member"},{"teamId":"3","status":"member"}]}';

Если вы хотите добавить последнюю позицию, используйте это:

var parse_obj = JSON.parse(Str_txt);
parse_obj['theTeam'].push({"teamId":"4","status":"pending"});
Str_txt = JSON.stringify(parse_obj);
Output //"{"theTeam":[{"teamId":"1","status":"pending"},{"teamId":"2","status":"member"},{"teamId":"3","status":"member"},{"teamId":"4","status":"pending"}]}"

Если вы хотите добавить первую позицию, используйте следующий код:

var parse_obj = JSON.parse(Str_txt);
parse_obj['theTeam'].unshift({"teamId":"4","status":"pending"});
Str_txt = JSON.stringify(parse_obj);
Output //"{"theTeam":[{"teamId":"4","status":"pending"},{"teamId":"1","status":"pending"},{"teamId":"2","status":"member"},{"teamId":"3","status":"member"}]}"

Любой, кто хочет добавить в определенную позицию массива, может попробовать следующее:

parse_obj['theTeam'].splice(2, 0, {"teamId":"4","status":"pending"});
Output //"{"theTeam":[{"teamId":"1","status":"pending"},{"teamId":"2","status":"member"},{"teamId":"4","status":"pending"},{"teamId":"3","status":"member"}]}"

Вышеупомянутый блок кода добавляет элемент после второго элемента.

Аджай Гупта
источник
1

Сначала нам нужно проанализировать объект JSON, а затем мы можем добавить элемент.

var str = '{"theTeam":[{"teamId":"1","status":"pending"},
{"teamId":"2","status":"member"},{"teamId":"3","status":"member"}]}';

var obj = JSON.parse(str);
obj['theTeam'].push({"teamId":"4","status":"pending"});
str = JSON.stringify(obj);

Наконец , мы JSON.stringify в OBJ обратно в формат JSON

Abhijit
источник
Что, если наш JSON не имеет такого имени, как theTeam, а вместо этого содержит только узлы с элементами teamId и status? так что мой будет выглядеть так: var str = '[{"teamId": "1", "status": "pending"}, {"teamId": "2", "status": "member"}, {"teamId ":" 3" , "статус": "член"}] ';
Шафик,
0

Например, вот такой элемент, как кнопка для добавления элемента в корзину и соответствующие атрибуты для сохранения в localStorage.

'<a href="#" cartBtn pr_id='+e.id+' pr_name_en="'+e.nameEn+'" pr_price="'+e.price+'" pr_image="'+e.image+'" class="btn btn-primary"><i class="fa fa-shopping-cart"></i>Add to cart</a>'

var productArray=[];


$(document).on('click','[cartBtn]',function(e){
  e.preventDefault();
  $(this).html('<i class="fa fa-check"></i>Added to cart');
  console.log('Item added ');
  var productJSON={"id":$(this).attr('pr_id'), "nameEn":$(this).attr('pr_name_en'), "price":$(this).attr('pr_price'), "image":$(this).attr('pr_image')};


  if(localStorage.getObj('product')!==null){
    productArray=localStorage.getObj('product');
    productArray.push(productJSON);  
    localStorage.setObj('product', productArray);  
  }
  else{
    productArray.push(productJSON);  
    localStorage.setObj('product', productArray);  
  }


});

Storage.prototype.setObj = function(key, value) {
    this.setItem(key, JSON.stringify(value));
}

Storage.prototype.getObj = function(key) {
    var value = this.getItem(key);
    return value && JSON.parse(value);
}

После добавления объекта JSON в массив результат (в LocalStorage):

[{"id": "99", "nameEn": "Product Name1", "price": "767", "image": "1462012597217.jpeg"}, {"id": "93", "nameEn" : "Product Name2", "price": "76", "image": "1461449637106.jpeg"}, {"id": "94", "nameEn": "Product Name3", "price": "87" , "образ": "1461449679506.jpeg"}]

после этого действия вы можете легко отправить данные на сервер в виде списка в Java

Полный пример кода здесь

Как хранить простую тележку с помощью localStorage?

Musa
источник
0

В моем случае в моем объекте JSON не было существующего массива, поэтому мне пришлось сначала создать элемент массива, а затем нужно было нажать этот элемент.

  elementToPush = [1, 2, 3]
  if (!obj.arr) this.$set(obj, "arr", [])
  obj.arr.push(elementToPush)  

(Этот ответ может не иметь отношения к этому конкретному вопросу, но может помочь кому-то другому)

Аджит А. Кенджале
источник
0

Предположим, у нас уже есть данные в переменной alreadyData;

var alreadyData=[{"id":"99","nameEn":"Product Name1","price":"767","image":"1462012597217.jpeg"},{"id":"93","nameEn":"Product Name2","price":"76","image":"1461449637106.jpeg"},{"id":"94","nameEn":"Product Name3","price":"87","image":"1461449679506.jpeg"}];

var fields = []; //new array
var json = JSON.parse(alreadyData); //just parse in one variable
var json = JSON.parse(tableColumns);
for (var i = 0; i < json.length; i++) {
    fields.push(json[i]);//push data in fields
} 
fields.push({ 'id':33, 'nameEn': 'Singh', 'price': '222','image': '1462012597217.jpeg' }); // its new data
Давиндер Сингх
источник