Incluindo um Novo Elemento de Matriz em um Objeto JSON

120

Eu tenho um objeto de formato JSON que li de um arquivo JSON que tenho em uma variável chamada teamJSON, que se parece com isso:

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

Quero adicionar um novo item à matriz, como

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

para acabar com

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

antes de voltar a gravar no arquivo. Qual é uma boa maneira de adicionar ao novo elemento? Cheguei perto, mas todas as aspas duplas foram escapadas. Procurei uma boa resposta no SO, mas nenhuma cobre totalmente esse caso. Qualquer ajuda é apreciada.

Charles Wyke-Smith
fonte
6
yourObj.theTeam.push({"teamId":"4","status":"pending"});
PSL
2
"JSON" não é um objeto - é uma notação.
precisa saber é o seguinte
1
Quando você lê o objeto JSON do arquivo, ele está sendo interpretado como JSON ou uma string? Se for uma string, você precisará analisá-la primeiro como JSON, em seguida, poderá fazer o que os outros comentários e respostas estão sugerindo.
Mark
3
@ Charles leu seu título e reexaminou seu comentário.
precisa saber é o seguinte
1
@ CharlesWyke-Smith Que tipo é sua teamJSONvariável? É uma string JSON, '{"theTeam":[...]}'ou seja, um literal de objeto real? Dica: useconsole.log(typeof teamJSON)
Phil

Respostas:

233

JSON é apenas uma notação ; para fazer a alteração desejada parse, para que você possa aplicar as alterações a um Objeto JavaScript nativo e , em seguida, stringifyretornar ao 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"}]}"
Paul S.
fonte
16
+1 para apontar isso precisa ser analisado primeiro em um objeto a ser manipulado.
precisa saber é o seguinte
3
Ele disse que já possui o objeto em uma variável chamada teamJSON. Em nenhum momento é mencionada uma cadeia de caracteres.
Phil
6
@ Phil: Se é JSON, é uma string. Se não for, não é JSON.
user2736012
1
As aspas vazadas na verdade me fazem pensar se o JSON foi codificado duas vezes.
user2736012
24
Paul, essa é uma resposta muito construtiva. Ele aborda a deficiência na declaração do problema sem menosprezar o pôster original. Delineia mais claramente os limites entre operar nos objetos javascript e a representação de texto JSON desses objetos. Eu acho que é essencial entender que, uma vez analisado o JSON, estamos operando em objetos javascript puros - o fato de que eles originalmente vieram do JSON é irrelevante. De qualquer forma, ler sua resposta foi uma lufada de ar fresco depois de todos os comentários depreciativos que fizeram o OP parecer um idiota.
Larry Hector
20
var Str_txt = '{"theTeam":[{"teamId":"1","status":"pending"},{"teamId":"2","status":"member"},{"teamId":"3","status":"member"}]}';

Se você deseja adicionar na última posição , use o seguinte:

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

Se você deseja adicionar na primeira posição , use o seguinte código:

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

Qualquer pessoa que queira adicionar em uma determinada posição de uma matriz tenta o seguinte:

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

O bloco de código acima adiciona um elemento após o segundo elemento.

Ajay Gupta
fonte
1

Primeiro, precisamos analisar o objeto JSON e, em seguida, podemos adicionar um item.

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

Finalmente, JSON.stringify o obj de volta ao JSON

Abhijit
fonte
E se o nosso JSON não tiver um nome como theTeam, mas contiver apenas nós com os elementos teamId & status? assim o meu seria parecido com: var str = '[{"teamId": "1", "status": "pendente"}, {"teamId": "2", "status": "member"}, {"teamId ":" 3 "," status ":" membro "}] ';
Shafique
0

Por exemplo, aqui está um elemento como botão para adicionar item à cesta e atributos apropriados para salvar em 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);
}

Depois de adicionar o objeto JSON ao resultado da matriz, é (em LocalStorage):

[{"id": "99", "nameEn": "Product1", "price": "767", "image": "1462012597217.jpeg"}, {"id": "93", "nameEn" : "Nome do produto2", "preço": "76", "imagem": "1461449637106.jpeg"}, {"id": "94", "nameEn": "Nome do produto3", "preço": "87" , "imagem": "1461449679506.jpeg"}]

Após esta ação, você pode enviar dados para o servidor facilmente como Lista em Java

O exemplo de código completo está aqui

Como faço para armazenar um carrinho simples usando localStorage?

musa
fonte
0

No meu caso, meu objeto JSON não possuía nenhuma matriz existente, então tive que criar o elemento da matriz primeiro e depois pressionar o elemento.

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

(Esta resposta pode não ser relevante para esta pergunta em particular, mas pode ajudar outra pessoa)

Ajit A. Kenjale
fonte
0

Suponha que já tenhamos dados na variável 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
Davinder Singh
fonte