Может ли массив 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]);
}