2013-08-22 4 views
13

Может ли массив JSON содержать объекты разных пар ключ/значение. Из this tutorial, пример, приведенный в 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" первые однородные объекты или второстепенные гетерогенные объекты?

+3

Да, JSON массивы могут содержать любую допустимую строку JSON: объекты с разных пар ключ/значение, другие массивы, числа, строки, булевы все в одном массиве. – arnaud576875

+0

Идите сюда, чтобы протестировать любой javascript, который вы хотите: http://jsconsole.com/ – dmoss18

+0

Не только довольно старый, практика, которую он поддерживает, была неправильной уже за 13 лет до публикации статьи. –

ответ

11

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

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

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

Спасибо. Каков наилучший способ проверить, содержит ли массив JSON однородные объекты или нет? – tonga

+1

@tonga вы не сможете проверить однородность массива таким образом. Вы можете знать только, является ли массив однородным до тех пор, пока вы не закончите обработку всех его элементов. –

+0

ответ верный, но утверждение о XML неверно ... XML основан на хорошо известной спецификации и очень четком определении, но до если вы хотите использовать схему или нет, ее вариант. –

5

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

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

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

Спасибо. Может ли этот подход проверить, содержит ли массив однородные объекты или нет? Каков наилучший способ проверить однородность массива JSON с использованием JavaScript? – tonga

+1

@tonga это будет итерация. –

+0

Итак, нет единой встроенной функции JS для проверки массива? – tonga

1

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

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

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

+0

Если вы опустили голову, позвольте мне хотя бы знать _why_. Я прочитал вопрос и не вижу смысла в этом деле? – Broxzier

+0

Возможно, предложите отредактировать исходный вопрос для переформатирования? Не мой downvote, хотя ... – hurrymaplelad

1

Вы свободны делать то, что вы хотите с содержимым массива. 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]); 
} 
Смежные вопросы