Вкладені об’єкти JSON - чи потрібно використовувати масиви для всього?


109

Чи є спосіб вкласти в 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.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": ...}
Jason Orendorff

1
@Jason: Він, здається, це вже знає; він сам писав {"id":2,"name": ""}. Однак це більш-менш те, що він просить, тому я не впевнений.
СЛак

Відповіді:


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.

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, але можна отримати інформацію. Хоча як інші казали, ви можете попрасувати.

використовувати кожен () обгортання в іншому () до останнього масиву.

для 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);
        });
    });

});

`

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.