Hinzufügen eines neuen Array-Elements zu einem JSON-Objekt

120

Ich habe ein Objekt im JSON-Format, das ich aus einer JSON-Datei gelesen habe, die ich in einer Variablen namens teamJSON habe. Das sieht folgendermaßen aus:

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

Ich möchte dem Array ein neues Element hinzufügen, z

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

am Ende mit

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

bevor Sie in die Datei zurückschreiben. Was ist ein guter Weg, um das neue Element hinzuzufügen? Ich kam näher, aber alle doppelten Anführungszeichen wurden entkommen. Ich habe nach einer guten Antwort auf SO gesucht, aber keine deckt diesen Fall ganz ab. Jede Hilfe wird geschätzt.

Charles Wyke-Smith
quelle
6
yourObj.theTeam.push({"teamId":"4","status":"pending"});
PSL
2
"JSON" ist kein Objekt - es ist eine Notation.
Brad Christie
1
Wird das JSON-Objekt beim Lesen aus der Datei als JSON oder als Zeichenfolge interpretiert? Wenn es sich um eine Zeichenfolge handelt, müssen Sie die Zeichenfolge zuerst als JSON analysieren, dann können Sie das tun, was der andere Kommentar und die andere Antwort vorschlagen.
Mark
3
@ Charles liest deinen Titel und prüft dann deinen Kommentar erneut.
Brad Christie
1
@ CharlesWyke-Smith Welcher Typ ist Ihre teamJSONVariable? Ist es eine JSON-Zeichenfolge '{"theTeam":[...]}'oder ein tatsächliches Objektliteral? Hinweis: Verwenden Sieconsole.log(typeof teamJSON)
Phil

Antworten:

233

JSON ist nur eine Notation ; Um die gewünschte parseÄnderung vorzunehmen, können Sie die Änderungen auf ein natives JavaScript-Objekt und dann stringifyzurück auf JSON anwenden

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"}]}"
Paul S.
quelle
16
+1, um darauf hinzuweisen, muss zuerst in ein zu manipulierendes Objekt analysiert werden.
Brad Christie
3
Er sagte, er habe das Objekt bereits in einer Variablen namens teamJSON. Zu keinem Zeitpunkt wird eine Saite erwähnt
Phil
6
@Phil: Wenn es JSON ist, ist es eine Zeichenfolge. Wenn nicht, ist es nicht JSON.
user2736012
1
Die entkommenen Anführungszeichen lassen mich tatsächlich fragen, ob der JSON zweimal codiert wurde.
user2736012
24
Paul, das ist eine sehr konstruktive Antwort. Es behebt den Mangel in der Problemstellung, ohne das Originalplakat herabzusetzen. Es werden die Grenzen zwischen der Bearbeitung der Javascript-Objekte und der JSON-Textdarstellung dieser Objekte klarer umrissen. Ich denke, es ist wichtig zu verstehen, dass wir nach dem Parsen von JSON mit reinen Javascript-Objekten arbeiten - die Tatsache, dass sie ursprünglich von JSON stammen, ist irrelevant. Wie auch immer, das Lesen Ihrer Antwort war ein Hauch frischer Luft nach all den abfälligen Kommentaren, die das OP wie einen Idioten fühlen ließen.
Larry Hector
20
var Str_txt = '{"theTeam":[{"teamId":"1","status":"pending"},{"teamId":"2","status":"member"},{"teamId":"3","status":"member"}]}';

Wenn Sie an der letzten Position hinzufügen möchten, verwenden Sie Folgendes :

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

Wenn Sie an der ersten Position hinzufügen möchten, verwenden Sie den folgenden Code:

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

Jeder, der an einer bestimmten Position eines Arrays hinzufügen möchte, versucht dies:

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

Der obige Codeblock fügt nach dem zweiten Element ein Element hinzu.

Ajay Gupta
quelle
1

Zuerst müssen wir das JSON-Objekt analysieren und dann können wir ein Element hinzufügen.

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

Schließlich JSON.stringify das Objekt zurück zu JSON

Abhijit
quelle
Was ist, wenn unser JSON keinen Namen wie theTeam hat, sondern nur Knoten mit den Elementen teamId & status enthält? meine würde also so aussehen: var str = '[{"teamId": "1", "status": "ausstehend"}, {"teamId": "2", "status": "member"}, {"teamId ":" 3 "," status ":" member "}] ';
Shafique
0

Hier ist beispielsweise eine elementähnliche Schaltfläche zum Hinzufügen eines Artikels zum Warenkorb und entsprechende Attribute zum Speichern in 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);
}

Nach dem Hinzufügen eines JSON-Objekts zum Array-Ergebnis (in LocalStorage):

[{"id": "99", "nameEn": "Product Name1", "price": "767", "image": "1462012597217.jpeg"}, {"id": "93", "nameEn" : "Produktname2", "Preis": "76", "Bild": "1461449637106.jpeg"}, {"ID": "94", "NameEn": "Produktname3", "Preis": "87" , "image": "1461449679506.jpeg"}]

Nach dieser Aktion können Sie Daten einfach als Liste in Java an den Server senden

Das vollständige Codebeispiel finden Sie hier

Wie lagere ich einen einfachen Einkaufswagen mit localStorage?

Musa
quelle
0

In meinem Fall hatte mein JSON-Objekt kein vorhandenes Array, daher musste ich zuerst ein Array-Element erstellen und dann das Element verschieben.

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

(Diese Antwort ist möglicherweise für diese spezielle Frage nicht relevant, kann aber jemand anderem helfen.)

Ajit A. Kenjale
quelle