Может ли массив JSON содержать объекты разных пар ключ/значение?

Может ли массив JSON содержать объекты разных пар ключ/значение. Из этого руководства пример, приведенный для массива JSON, состоит из объектов той же пары ключ/значение:

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

Если я хочу изменить его, чтобы иметь разные пары ключ/значение внутри массива JSON, остается ли еще действительный JSON?

{
"example": [
{ "firstName":"John", "lastName":"Doe" },
{ "fruit":"apple" },
{ "length":100, "width":60, "height":30 }
]
}

Просто хочу подтвердить это. Если да, как я могу использовать JavaScript, чтобы узнать, содержит ли поле JSON "example" первые однородные объекты или второстепенные гетерогенные объекты?

Ответ 1

Вы можете использовать любую структуру, которая вам нравится. JSON не является схемой, основанной на том, как часто используется XML, а Javascript не статически типизирован.

вы можете конвертировать JSON в объект JS с использованием JSON.parse, а затем просто проверить наличие свойства

var obj = JSON.parse(jsonString);
if(typeof obj.example[0].firstName != "undefined") {
   //do something
}

Ответ 2

Не имеет значения, вы можете смешивать и сопоставлять столько, сколько хотите.

Вы можете просто проверить его

typeof someItem.example !== 'undefined' // True if `example` is defined.

Ответ 3

Это совершенно верно JSON. Лично я предпочитаю этот синтаксис лучше, потому что он читает проще:

{
    "example": [
        {
            "firstName": "John",
            "lastName": "Doe"
        },
        {
            "fruit": "apple"
        },
        {
            "length": 100,
            "width": 60,
            "height": 30
        }
    ]
}

Что касается ответа на второй вопрос, вы можете прочитать данные из строки JSON с помощью var data = JSON.parse(datastring);. Затем просто используйте его, вызывая data.property.secondlevel. Любая переменная может быть объектом, массивом, строкой или числом, позволяющим вложенные структуры.

Ответ 4

Вы можете делать то, что хотите, с содержимым массива. Jus помнит об этом, прежде чем пытаться перебрать свойства доступа к каждому элементу в вашем массиве.

одно: вы не сможете десериализовать это на что-нибудь еще, кроме массива объекта на своей стороне сервера, поэтому не получите сюрпризов позже.

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

var array = [{"type":"fruit", "color":"red"},
{"type":"dog", "name":"Harry"}];

var parser = {
    fruit:function(f){
   console.log("fruit:" + f.color);
    },
    dog: function(d){
    console.log("dog:"+d.name);
    }};

for(var i=0;i<array.length;i++){
    parser[array[i].type](array[i]);
}