29

Can a JSON array contain Objects of different key/value pairs. From this tutorial, the example given for JSON array consists of Objects of the same key/value pair:

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

If I want to change it to have different key/value pairs inside the JSON array, is the following still a valid JSON?

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

Just want to confirm this. If so, how can I use JavaScript to know if the JSON "example" field contains the first homogeneous objects or the second heterogeneous objects?

4

4 回答 4

24

你可以使用任何你喜欢的结构。JSON 不是基于 XML 经常使用的模式的模式,并且 Javascript 不是静态类型的。

您可以使用 JSON.parse 将 JSON 转换为 JS 对象,然后测试该属性的存在

var obj = JSON.parse(jsonString);
if(typeof obj.example[0].firstName != "undefined") {
   //do something
}
于 2013-08-22T18:55:23.327 回答
5

没关系,您可以随心所欲地混合搭配。

你可以测试一下

typeof someItem.example !== 'undefined' // True if `example` is defined.
于 2013-08-22T18:52:17.383 回答
3

这是完全有效的 JSON。我个人更喜欢这种语法,因为它更容易阅读:

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

至于回答您的第二个问题,您可以使用var data = JSON.parse(datastring);. 然后只需调用data.property.secondlevel. 任何变量都可以是对象、数组、字符串或数字,允许嵌套结构。

于 2013-08-22T18:54:37.263 回答
3

你可以自由地对数组的内容做你想做的事。在您尝试迭代数组中每个项目的访问属性之前,请记住这一点。

一件事:除了服务器端的对象数组之外,您将无法将其反序列化为其他任何内容,因此以后不要有意外。

作为提示,也许您可​​以在指定“类型”的对象中包含一个公共字段,以便稍后处理。

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]);
}
于 2013-08-22T19:03:59.513 回答