JSON stringify array de objetos com propriedade

Oct 11 2020

Eu estava tentando restringir uma série de objetos com propriedades extras.

var data = [{foo: "1", bar: "2"}, {foo: "2", bar:"3"}];
data.extra = ["a", "b"];

console.log(data)
// [{foo: "1", bar: "2"}, {foo: "2", bar:"3"}, extra: ["a", "b"]]

console.log(JSON.stringify(data));
//[{foo: "1", bar: "2"}, {foo: "2", bar:"3"}]

P : Por que a propriedade "extra" não é sequenciada? Como posso preservar a propriedade ausente em JSON.stringify ()?

Respostas

3 raina77ow Oct 11 2020 at 22:45

Porque datanão é apenas um objeto - é um array. E quando os Arrays são stringificados em JSON, todas as propriedades não numéricas são descartadas do resultado (já que não há como representá-los em [...]notação de qualquer maneira).

Se você ainda deseja ver essa propriedade em JSON, você deve usar objetos simples. Você pode morder a bala e apenas "objetivar" a matriz original com { ... }açúcar:

const data = [{foo: "1", bar: "2"}, {foo: "2", bar:"3"}];
data.extra = ["a", "b"];
JSON.stringify( {...data} );
// "{"0":{"foo":"1","bar":"2"},"1":{"foo":"2","bar":"3"},"extra":["a","b"]}"

... mas cuidado, todos aqueles adereços "0", "1" serão vistos dentro de seu JSON como estão, e essa não é a melhor das visualizações. Geralmente é mais limpo apenas para usar uma propriedade adicional:

const data = [{foo: "1", bar: "2"}, {foo: "2", bar:"3"}];
const extra = ["a", "b"];
const output = {
  data,
  extra
};
JSON.stringify(output);
// "{"data":[{"foo":"1","bar":"2"},{"foo":"2","bar":"3"}],"extra":["a","b"]}"
TomerLevitski Oct 11 2020 at 22:46

Você pode colocar o extra: [...] dentro {} o que fará no objeto. Então você pode restringi-lo.

hosseinsedighian Oct 11 2020 at 22:48

seu json é Array, mas você colocou uma chave para eles

se quiser usá-lo com palavra-chave, você deve usar:

var data = [{foo: "1", bar: "2"}, {foo: "2", bar:"3"}];
data.push(["a", "b"]) ;

console.log(data)
// [{foo: "1", bar: "2"}, {foo: "2", bar:"3"}, extra: ["a", "b"]]

console.log(JSON.stringify(data));
//[{foo: "1", bar: "2"}, {foo: "2", bar:"3"}]

MatteoDalGrande Oct 11 2020 at 22:54

{...} é usado para definir um único objeto, enquanto o outro [...] é uma matriz e é usado para definir uma sequência de objetos, valores ou listas ...

objetos são definidos como {chave: objeto ou lista ou valor, ...} lista ares nada mais do que uma seqüência de objetos ou listas ou valores, [objetos ou lista ou valores, ...] ...

tente usar um único objeto e não uma matriz.