Вложенные объекты JSON - нужно ли для всего использовать массивы?

110

Есть ли способ иметь вложенные объекты в JSON, чтобы мне не приходилось делать массивы из всего? Чтобы мой объект анализировался без ошибок, мне, кажется, нужна такая структура:

{"data":[{"stuff":[
    {"onetype":[
        {"id":1,"name":"John Doe"},
        {"id":2,"name":"Don Joeh"}
    ]},
    {"othertype":[
        {"id":2,"company":"ACME"}
    ]}]
},{"otherstuff":[
    {"thing":
        [[1,42],[2,2]]
    }]
}]}

Если я получу этот объект в переменную с именем "result", мне придется получить доступ к вложенным объектам следующим образом:

result.data[0].stuff[0].onetype[0]

и

result.data[1].otherstuff[0].thing[0]

Мне это кажется неуклюжим и избыточным, если возможно, я бы предпочел:

result.stuff.onetype[0]

и

result.otherstuff.thing

Но как я могу использовать ключи объекта напрямую, когда все является массивом? Моему растерянному и необразованному уму что-то вроде этого показалось бы более подходящим:

{"data":
    {"stuff":
        {"onetype":[
            {"id":1,"name": ""},
            {"id":2,"name": ""}
        ]}
        {"othertype":[
            {"id":2,"xyz": [-2,0,2],"n":"Crab Nebula","t":0,"c":0,"d":5}
        ]}
    }
    {"otherstuff":
        {"thing":
            [[1,42],[2,2]]
        }
    }
}

Я, вероятно, неправильно понял здесь что-то фундаментальное, но я не могу заставить парсер jQuery (или собственный парсер FF, используемый jQuery 1.4) принять второй объект стиля. Если кто-нибудь может просветить меня, я буду признателен!

Джон Шульце
источник
1
Синтаксис для объекта с более чем одним свойством выглядит следующим образом:{"stuff": ..., "otherstuff": ...}
Джейсон Орендорф,
1
@Jason: Он появляется уже знать , что; он сам написал {"id":2,"name": ""}. Однако он более или менее спрашивает об этом, поэтому я не уверен.
SLaks

Ответы:

202

Вам не нужно использовать массивы.

Значения JSON могут быть массивами, объектами или примитивами (числами или строками).

Вы можете написать JSON так:

{ 
    "stuff": {
        "onetype": [
            {"id":1,"name":"John Doe"},
            {"id":2,"name":"Don Joeh"}
        ],
        "othertype": {"id":2,"company":"ACME"}
    }, 
    "otherstuff": {
        "thing": [[1,42],[2,2]]
     }
}

Вы можете использовать это так:

obj.stuff.onetype[0].id
obj.stuff.othertype.id
obj.otherstuff.thing[0][1]  //thing is a nested array or a 2-by-2 matrix.
                            //I'm not sure whether you intended to do that.
SLaks
источник
9

Каждый объект должен быть назван внутри родительского объекта:

{ "data": {
    "stuff": {
        "onetype": [
            { "id": 1, "name": "" },
            { "id": 2, "name": "" }
        ],
        "othertype": [
            { "id": 2, "xyz": [-2, 0, 2], "n": "Crab Nebula", "t": 0, "c": 0, "d": 5 }
        ]
    },
    "otherstuff": {
        "thing":
            [[1, 42], [2, 2]]
    }
}
}

Таким образом, вы не можете объявить такой объект:

var obj = {property1, property2};

Должно быть

var obj = {property1: 'value', property2: 'value'};
Игорь Зевака
источник
8

У вас слишком много избыточных вложенных массивов внутри ваших данных jSON, но можно получить информацию. Хотя, как и другие говорили, вы можете очистить его.

используйте each () для обертывания внутри другого each () до последнего массива.

поскольку result.data[0].stuff[0].onetype[0]в jQuery вы можете сделать следующее:

`

$.each(data.result.data, function(index0, v) {
    $.each(v, function (index1, w) {
        $.each(w, function (index2, x) {
            alert(x.id);
        });
    });

});

`

Сярул
источник