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 2013

2
「JSON」はオブジェクトではなく、表記法です。
ブラッドクリスティ

1
ファイルからJSONオブジェクトを読み取るとき、それはJSONまたは文字列として解釈されますか?その文字列が最初にJSONとして文字列を解析する必要がある場合、他のコメントと回答が示唆していることを実行できます。
マーク

3
@Charlesはあなたのタイトルを読み、それからあなたのコメントを再調査します。
ブラッドクリスティ

1
@ CharlesWyke-Smith teamJSON変数の型は何ですか?それはJSON文字列、すなわち'{"theTeam":[...]}'実際のオブジェクトリテラルですか?ヒント:使用console.log(typeof teamJSON)
Phil

回答:


233

JSONは単なる表記法です。必要な変更をparse加えて、変更をネイティブJavaScriptオブジェクトに適用し、JSONにstringify戻すことができます

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。文字列は言及されていません
Phil

6
@Phil:JSONの場合、文字列です。そうでない場合は、JSONではありません。
user2736012 2013

1
エスケープされた引用符は、実際にはJSONが2回エンコードされているのかどうか疑問に思います。
user2736012 2013

24
ポール、それは非常に建設的な答えです。元のポスターを傷つけることなく、問題の説明の欠陥に対処します。これは、javascriptオブジェクトの操作とそれらのオブジェクトのJSONテキスト表現の境界をより明確に示しています。JSONが解析されたら、純粋なJavaScriptオブジェクトを操作していることを理解する上で重要だと思います。元々はJSONから来ていたという事実は関係ありません。とにかく、あなたの答えを読むことは、すべての軽蔑的なコメントがOPをバカのように感じさせた後の新鮮な空気の息でした。
ラリーヘクター

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

上記のコードブロックは、2番目の要素の後に要素を追加します。


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へのバック


JSONにtheTeamのような名前がなく、代わりに要素teamIdおよびstatusを持つノードのみが含まれている場合はどうなりますか?だから私のものは次のようになります:var str = '[{"teamId": "1"、 "status": "pending"}、{"teamId": "2"、 "status": "member"}、{"teamId ":" 3 "、"ステータス ":"メンバー "}] ';
Shafique

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": "製品名1"、 "価格": "767"、 "画像": "1462012597217.jpeg"}、{"id": "93"、 "nameEn" : "製品名2"、 "価格": "76"、 "画像": "1461449637106.jpeg"}、{"id": "94"、 "nameEn": "製品名3"、 "価格": "87" 、 "image": "1461449679506.jpeg"}]

このアクションの後、Javaのリストとしてデータをサーバーに簡単に送信できます

完全なコード例はこちら

localStorageを使用して単純なカートを保管するにはどうすればよいですか?


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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.