JSON nesnesine yeni bir dizi öğesi ekleme


120

TeamJSON adlı bir değişkende sahip olduğum JSON dosyasından okuduğum JSON biçimli bir nesnem var, şöyle görünüyor:

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

Diziye yeni bir öğe eklemek istiyorum, örneğin

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

ile sonuçlanmak

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

dosyaya geri yazmadan önce. Yeni öğeye eklemenin iyi bir yolu nedir? Yaklaştım ama tüm çift alıntılar kaçtı. SO hakkında iyi bir cevap aradım ama hiçbiri bu vakayı tam olarak kapsamadı. Herhangi bir yardım takdir edilmektedir.


6
yourObj.theTeam.push({"teamId":"4","status":"pending"});
PSL

2
"JSON" bir nesne değil - bir gösterimdir.
Brad Christie

1
JSON nesnesini dosyadan okuduğunuzda, JSON olarak mı yoksa bir dize olarak mı yorumlanıyor? Eğer dizge ise ilk önce JSON olarak ayrıştırmanız gerekiyorsa, diğer yorum ve cevabın önerdiği şeyi yapabilirsiniz.
Mark

3
@Charles başlığınızı okuyun ve ardından yorumunuzu yeniden inceleyin.
Brad Christie

1
@ CharlesWyke-Smith teamJSONDeğişkeniniz ne tür ? Bir JSON dizesi mi, yani '{"theTeam":[...]}'gerçek bir nesne değişmezi mi? İpucu: kullanınconsole.log(typeof teamJSON)
Phil

Yanıtlar:


233

JSON yalnızca bir gösterimdir ; İstediğiniz değişikliği yapmak için parsebir yerli değişiklikleri uygulayabilirsiniz öyle JavaScript Nesne daha sonra stringifygeri 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, bunun işlenecek bir nesneye ayrıştırılması gerektiğini işaret etmek için.
Brad Christie

3
Adında bir değişkende nesnenin zaten olduğunu söyledi teamJSON. Hiçbir noktada bir dizeden bahsedilmez
Phil

6
@Phil: JSON ise, bir dizedir. Değilse, JSON değildir.
user2736012

1
Kaçan alıntılar aslında JSON'un iki kez kodlanıp kodlanmadığını merak etmeme neden oluyor.
user2736012

24
Paul, bu çok yapıcı bir cevap. Orijinal posteri küçümsemeden problem ifadesindeki eksikliği giderir. Javascript nesneleri üzerinde çalışma ile bu nesnelerin JSON metin gösterimi arasındaki sınırları daha net bir şekilde tanımlar. JSON bir kez ayrıştırıldıktan sonra, saf javascript nesneleri üzerinde çalıştığımızı anlamak için çok önemli olduğunu düşünüyorum - bunların orijinal olarak JSON'dan geldikleri gerçeği alakasız. Her neyse, OP'yi aptal gibi hissettiren tüm aşağılayıcı yorumlardan sonra cevabınızı okumak bir nefes temiz hava oldu.
Larry Hector

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

Son konumda eklemek istiyorsanız, şunu kullanın:

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

İlk pozisyonda eklemek istiyorsanız , aşağıdaki kodu kullanın:

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

Bir dizinin belirli bir konumuna eklemek isteyenler şunu deneyin:

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

Yukarıdaki kod bloğu, ikinci öğeden sonra bir öğe ekler.


1

Öncelikle JSON nesnesini ayrıştırmamız gerekiyor ve ardından bir öğe ekleyebiliriz.

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

Sonunda JSON.stringify obj JSON geri


JSON'umuzun theTeam gibi bir adı yoksa, bunun yerine yalnızca teamId & status öğelerine sahip düğümleri içeriyorsa ne olur? benimki şöyle görünecektir: var str = '[{"teamId": "1", "status": "pending"}, {"teamId": "2", "status": "member"}, {"teamId ":" 3" , "durum": "üye"}] ';
Shafique

0

Örneğin, burada sepete öğe eklemek için düğme ve localStorage'da kaydetmek için uygun özellikler gibi bir öğe var.

'<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 nesnesini Array'e ekledikten sonra sonuç (LocalStorage'da):

[{"id": "99", "nameEn": "Ürün Adı1", "fiyat": "767", "resim": "1462012597217.jpeg"}, {"id": "93", "nameEn" : "Ürün Adı2", "fiyat": "76", "resim": "1461449637106.jpeg"}, {"id": "94", "nameEn": "Ürün Adı3", "fiyat": "87" , "görüntü": "1461449679506.jpeg"}]

bu işlemden sonra verileri Java'da Liste olarak kolayca sunucuya gönderebilirsiniz

Tam kod örneği burada

LocalStorage kullanarak basit bir sepeti nasıl saklarım?


0

Benim durumumda, JSON nesnemin içinde mevcut bir Array yoktu, bu yüzden önce dizi öğesini oluşturmalı ve ardından öğeyi itmeliydim.

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

(Bu yanıt, bu belirli soruyla alakalı olmayabilir, ancak başka birine yardımcı olabilir)


0

Zaten değişken verilerimiz olduğunu varsayalım 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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.