Criar objeto JSON dinamicamente via JavaScript (sem strings concate)

130

Eu tenho esses dados JSON:

{
    "employees": [
        {
            "firstName": "John",
            "lastName": "Doe"
        },
        {
            "firstName": "Anna",
            "lastName": "Smith"
        },
        {
            "firstName": "Peter",
            "lastName": "Jones"
        }
    ]
}

Suponha que eu não conheça quantas colunas e linhas de funcionários possuo, como crio esse objeto em JavaScript (sem strings concatenadas)? Suponha que eu recebo cada linha no método "onGeneratedRow" e preciso enviar cada coluna (firstName, lastName) para os colchetes '{}'.

var viewData = { 
    employees : [] 
};

var rowNum = -1; 

function onGeneratedRow(columnsResult)
{
    rowNum = rowNum + 1;
    viewData.employees.push({});    
    columnsResult.forEach(function(column) {                  
    var columnName = column.metadata.colName;
    viewData.employees[rowNum][columnName] = column.value;  });
}
ohadinho
fonte
1
O que é columnsResult? O que é metadata?
Georg
1
No momento, essas perguntas não fazem sentido para mim. Você pode explicar melhor de onde vêm seus dados e em que formato. Você está apenas adicionando dados existentes ou criando todos eles do zero. Talvez você possa criar um jsfiddle para demonstrar qual é o problema que você está enfrentando. A sua pergunta é realmente apenas: como acessar dados em um objeto de matriz / ou javascript? E vamos ser claros sobre os dados, JSON ou Javascript objeto: stackoverflow.com/questions/8294088/javascript-object-vs-json
Xotic750
2
suponha que "columnName" seja "firstName" e "column.value" seja o valor (por exemplo: "John"). Eu só preciso saber como empurrá-los dinamicamente para o parênteses ('{}')
ohadinho 12/05
1
O que acontece quando você executa o código que você mostrou?
Nnnnnn 12/05
@ohadinho não está claro qual é o seu strucuture dados de entrada (JSON)columnsResult
Kamil Kiełczewski

Respostas:

154

Isto é o que você precisa!

function onGeneratedRow(columnsResult)
{
    var jsonData = {};
    columnsResult.forEach(function(column) 
    {
        var columnName = column.metadata.colName;
        jsonData[columnName] = column.value;
    });
    viewData.employees.push(jsonData);
 }
Waqar Alamgir
fonte
Como você sabia que o OP não precisa contar as linhas com'rowNum '?
Xotic750
1
push não precisa de número de linha
Waqar Alamgir
como a geração json não precisa de contagem, mais você sempre pode usar .length para obter linhas.
Waqar Alamgir
5
Eu nunca disse que a geração JSON faz. Foi mais o caso de você declarar "Isto é o que você precisa!", Mas eu queria saber como você sabia que essa contagem não era necessária pelo OP, ou você acabou de assumir? Sua resposta não gera JSON btw.
Xotic750
1
@WaqarAlamgir - é exatamente o que eu precisava neste momento. Felicidades!
bob.mazzo
96

Talvez esta informação o ajude.

var sitePersonel = {};
var employees = []
sitePersonel.employees = employees;
console.log(sitePersonel);

var firstName = "John";
var lastName = "Smith";
var employee = {
  "firstName": firstName,
  "lastName": lastName
}
sitePersonel.employees.push(employee);
console.log(sitePersonel);

var manager = "Jane Doe";
sitePersonel.employees[0].manager = manager;
console.log(sitePersonel);

console.log(JSON.stringify(sitePersonel));

Xotic750
fonte
10

Este tópico, especialmente a resposta do Xotic750, foi muito útil para mim. Eu queria gerar uma variável json para passá-lo para um script php usando ajax. Meus valores foram armazenados em duas matrizes, e eu os queria no formato json. Este é um exemplo genérico:

valArray1 = [121, 324, 42, 31];
valArray2 = [232, 131, 443];
myJson = {objArray1: {}, objArray2: {}};
for (var k = 1; k < valArray1.length; k++) {
    var objName = 'obj' + k;
    var objValue = valArray1[k];
    myJson.objArray1[objName] = objValue;
}
for (var k = 1; k < valArray2.length; k++) {
    var objName = 'obj' + k;
    var objValue = valArray2[k];
    myJson.objArray2[objName] = objValue;
}
console.log(JSON.stringify(myJson));

O resultado no log do console deve ser algo como isto:

{
   "objArray1": {
        "obj1": 121,
        "obj2": 324,
        "obj3": 42,
        "obj4": 31
   },
   "objArray2": {
        "obj1": 232,
        "obj2": 131,
        "obj3": 443
  }
}
o efeito Borboleta
fonte
2
Posso enfatizar a utilidade de espaçar adequadamente o código que você enviar aqui? É muito mais difícil ler sem espaçamento.
Kevin Lewis
1
Isso me ajudou sem fim. Exatamente o que eu exigi.
Derek
-1

Javascript

var myObj = {
   id: "c001",
   name: "Hello Test"
}

Resultado (JSON)

{
   "id": "c001",
   "name": "Hello Test"
}
Ishan Lakshitha
fonte