【问题标题】:How do I make a JSON object with multiple arrays?如何创建具有多个数组的 JSON 对象?
【发布时间】:2012-06-27 05:01:20
【问题描述】:

我以前从未使用过 JSON,所以我不熟悉它的语法。

目前我有多个包含不同数据的数组。

我想创建一个 JSON 对象,其中包含多个数组,每个数组都有几条数据。

例如

一个名为汽车的对象,包含多个数组,每个数组对应不同的汽车品牌。在每个数组中都是汽车模型以及一些其他类型的数据,例如门的数量(并不重要,它只是一个虚构的例子。)

如果有人用示例解释语法,将不胜感激。

【问题讨论】:

  • 您不直接使用 JSON,除非在极少数情况下。您使用本机数据结构,然后使用库将该结构转换为 JSON 字符串。

标签: json


【解决方案1】:
var cars = [
    manufacturer: [
        {
            color: 'gray',
            model: '1',
            nOfDoors: 4
        },
        {
            color: 'yellow',
            model: '2',
            nOfDoors: 4
        }
    ]
]

【讨论】:

  • 在对象内部有一个汽车制造商数组怎么样?所以cars > manufacturer > model, color, doors。 (对象内数组中的数组)
【解决方案2】:

在最外层,JSON 对象以 { 开头并以 } 结尾。

样本数据:

{
    "cars": {
        "Nissan": [
            {"model":"Sentra", "doors":4},
            {"model":"Maxima", "doors":4},
            {"model":"Skyline", "doors":2}
        ],
        "Ford": [
            {"model":"Taurus", "doors":4},
            {"model":"Escort", "doors":4}
        ]
    }
}

如果将 JSON 分配给名为 data 的变量,则访问它的方式如下:

data.cars['Nissan'][0].model   // Sentra
data.cars['Nissan'][1].model   // Maxima
data.cars['Nissan'][2].doors   // 2

for (var make in data.cars) {
    for (var i = 0; i < data.cars[make].length; i++) {
        var model = data.cars[make][i].model;
        var doors = data.cars[make][i].doors;
        alert(make + ', ' + model + ', ' + doors);
    }
}

另一种方法(对汽车模型使用关联数组而不是索引数组):

{
    "cars": {
        "Nissan": {
            "Sentra": {"doors":4, "transmission":"automatic"},
            "Maxima": {"doors":4, "transmission":"automatic"}
        },
        "Ford": {
            "Taurus": {"doors":4, "transmission":"automatic"},
            "Escort": {"doors":4, "transmission":"automatic"}
        }
    }
}

data.cars['Nissan']['Sentra'].doors   // 4
data.cars['Nissan']['Maxima'].doors   // 4
data.cars['Nissan']['Maxima'].transmission   // automatic

for (var make in data.cars) {
    for (var model in data.cars[make]) {
        var doors = data.cars[make][model].doors;
        alert(make + ', ' + model + ', ' + doors);
    }
}

编辑:

更正:JSON 对象以{ 开头并以} 结尾,但具有以[ 开头并以] 结尾的JSON 数组(在最外层)也是有效的。

此外,原始 JSON 数据中的重大语法错误已得到纠正:JSON 对象中的所有键名必须用双引号括起来,JSON 对象或 JSON 数组中的所有字符串值也必须用双引号括起来。

参见:

【讨论】:

  • 只是为了澄清:这是一个对象吗?它需要[]括号吗?
  • JSON 数据是一个对象(基本上是一个关联数组)。索引数组使用方括号[0,1,2],而关联数组使用花括号{x:1,y:2,z:3}。最外层对象中的任何数据都可以是任一类型的数组,但最外层对象本身必须使用花括号。
  • 我将如何在这个城镇中循环:pastebin.com/qyQ2Y9sn 这样我就可以访问 lat 和 lng。
  • for (var town in markers.towns) { alert(markers.towns[town].lat) }
  • 当然,没问题 :) 我在上面的两个示例中都添加了一些遍历 JSON 数据的示例。
【解决方案3】:

我正在阅读的一本好书:Nicholas C. Zakas 第 3 版的面向 Web 开发人员的专业 JavaScript 包含以下有关 JSON 语法的信息:

“JSON 语法允许表示三种类型的值”。

关于你感兴趣的,Arrays 它说:

“数组在 JSON 中使用 JavaScript 中的数组文字表示法表示。例如,这是 JavaScript 中的数组:

var values = [25, "hi", true];

您可以使用类似的语法在 JSON 中表示相同的数组:

[25, "hi", true]

请注意没有变量或分号。数组和对象可以一起使用来表示更复杂的数据集合,例如:

{
    "books":
              [
                {
                    "title": "Professional JavaScript",
                    "authors": [
                        "Nicholas C. Zakas"
                    ],
                    "edition": 3,
                    "year": 2011
                },
                {
                    "title": "Professional JavaScript",
                    "authors": [
                        "Nicholas C.Zakas"
                    ],
                    "edition": 2,
                    "year": 2009
                },
                {
                    "title": "Professional Ajax",
                    "authors": [
                        "Nicholas C. Zakas",
                        "Jeremy McPeak",
                        "Joe Fawcett"
                    ],
                    "edition": 2,
                    "year": 2008
                }
              ]
}

这个数组包含许多代表书籍的对象,每个对象都有几个键,其中一个是“作者”,这是另一个数组。对象和数组通常是 JSON 数据结构的顶级部分(尽管这不是必需的),可用于创建大量数据结构。”

要将 JavaScript 对象序列化(转换)为 JSON 字符串,您可以使用 JSON 对象的 stringify() 方法。对于 Mark Linus 的示例回答:

var cars = [{
    color: 'gray',
    model: '1',
    nOfDoors: 4
    },
    {
    color: 'yellow',
    model: '2',
    nOfDoors: 4
}];

cars 现在是一个 JavaScript 对象。要将其转换为 JSON 对象,您可以这样做:

var jsonCars = JSON.stringify(cars);

产量:

"[{"color":"gray","model":"1","nOfDoors":4},{"color":"yellow","model":"2","nOfDoors":4}]"

相反,将 JSON 对象转换为 JavaScript 对象(这称为解析),您可以使用 parse() 方法。如果您需要更多信息,请搜索这些术语...或获取这本书,其中有很多示例。

【讨论】:

  • 在上面的例子中,“edition”和“year”应该用引号引起来 - jsonlint.co.uk 否则不会验证
【解决方案4】:

另一个例子:

[  
[  
    {  
        "@id":1,
        "deviceId":1,
        "typeOfDevice":"1",
        "state":"1",
        "assigned":true
    },
    {  
        "@id":2,
        "deviceId":3,
        "typeOfDevice":"3",
        "state":"Excelent",
        "assigned":true
    },
    {  
        "@id":3,
        "deviceId":4,
        "typeOfDevice":"júuna",
        "state":"Excelent",
        "assigned":true
    },
    {  
        "@id":4,
        "deviceId":5,
        "typeOfDevice":"nffjnff",
        "state":"Regular",
        "assigned":true
    },
    {  
        "@id":5,
        "deviceId":6,
        "typeOfDevice":"44",
        "state":"Excelent",
        "assigned":true
    },
    {  
        "@id":6,
        "deviceId":7,
        "typeOfDevice":"rr",
        "state":"Excelent",
        "assigned":true
    },
    {  
        "@id":7,
        "deviceId":8,
        "typeOfDevice":"j",
        "state":"Excelent",
        "assigned":true
    },
    {  
        "@id":8,
        "deviceId":9,
        "typeOfDevice":"55",
        "state":"Excelent",
        "assigned":true
    },
    {  
        "@id":9,
        "deviceId":10,
        "typeOfDevice":"5",
        "state":"Excelent",
        "assigned":true
    },
    {  
        "@id":10,
        "deviceId":11,
        "typeOfDevice":"5",
        "state":"Excelent",
        "assigned":true
    }
],
1
]

读取数组的

$.each(data[0], function(i, item) {
         data[0][i].deviceId + data[0][i].typeOfDevice  + data[0][i].state +  data[0][i].assigned 
    });

使用http://www.jsoneditoronline.org/ 更好地理解 JSON 代码

【讨论】:

  • json 倒数第二行的 1 是什么意思?
  • @PhilipKirkbride 最外层数组的第二个元素?
【解决方案5】:
Using the below method pass any value which is an array:

Use:
<dependency>
    <groupId>com.jayway.jsonpath</groupId>
    <artifactId>json-path</artifactId>
    <version>2.5.0</version>
</dependency>


Input parameter: URL, like 
Example: "$node.[any int value of array].anyKeyWhichInArray"
Example: "$.cars.Nissan.[0].model"





    public String getAnyValueFromResponseBody(String jsonBody, String url) {
        String value = "";
        try {
          value = JsonPath.read(jsonBody, url).toString();
          System.out.println(value);
        } catch (Exception var6) {
          System.error.println("unable to parse "+url);
        }
        return value;
      }

【讨论】:

    猜你喜欢
    • 2022-01-07
    • 1970-01-01
    • 2013-05-14
    • 2015-05-23
    • 2018-08-15
    • 1970-01-01
    • 1970-01-01
    • 2021-02-19
    • 2021-05-19
    相关资源
    最近更新 更多