如何创建一个包含多个数组的JSON对象?

95

我以前从没用过JSON,所以对其语法不熟悉。

现在我有多个包含不同数据片段的数组。

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

例如:

一个名为 cars 的对象,包含多个数组,每个数组代表不同品牌的汽车。每个数组中都会有汽车型号和其他一些数据类型(比如车门数量,这只是一个虚构的例子)。

如果有人能给出带有示例的语法解释,将不胜感激。


2
你不会直接使用JSON,除非在非常罕见的情况下。你会使用本地数据结构,然后使用库将该结构转换为JSON字符串。 - Marc B
6个回答

188

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数组中的所有字符串值也必须用双引号括起来。

参见:


5
JSON数据是一个对象(基本上是一个关联数组)。索引数组使用方括号 [0,1,2],而关联数组使用花括号 {x:1,y:2,z:3}。最外层对象中的任何数据都可以是这两种类型的数组,但最外层对象本身必须使用花括号。 - Matt Coughlin
1
for (var town in markers.towns) { alert(markers.towns[town].lat) } - Matt Coughlin
1
当然,没问题 :) 我在上面的两个示例中添加了一些遍历JSON数据的示例。 - Matt Coughlin
@MattCoughlin 这里的数据类型是 JSONObject 吗? - Ragini
第二个代码示例中有一个拼写错误:data.cars['Nissan'][2].doors 应该是 data.cars['Nissan'][1].doors。我无法编辑答案,因为我至少需要编辑6个字符。 - Luca
显示剩余9条评论

24

我正在阅读的一本好书是《Web开发专业JavaScript》第三版,作者是Nicholas C. Zakas。关于JSON语法,书中提到:

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

对于你所关心的数组,书中说:

"在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”应该用引号括起来 - 否则https://jsonlint.co.uk/将无法验证。 - rexall

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 是什么意思? - Philip Kirkbride
1
@PhilipKirkbride 最外层数组的第二个元素是什么? - rootkea

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

在对象内部放置一个汽车制造商数组怎么样?这样 cars > manufacturer > model, color, doors。(即对象内的数组中嵌套了另一个数组) - Harry

0
我知道这是一个老问题,但我想再加上一个JSON示例和Java代码。
示例JSON:
{
  "cars": [
      {
        "model": "Nissan",
        "code": "1",
        "id": "12",
        "properties": {"color": "red", "doors": "4", "engine": "best", "price": "500", "is_electric": "false"}
      },
      {
        "model": "Tesla",
        "code": "2",
        "id": "13",
        "properties": {"color": "grey", "doors": "4", "engine": "best", "price": "800", "is_electric": "true"}
      },
      {
        "model": "Kia",
        "code": "3",
        "id": "14",
        "properties": {"color": "green", "doors": "4", "engine": "diesel", "price": "900", "is_electric": "false"}
      }
  ]
}
  • "cars"代表一个JSON数组
  • "cars"数组中的每个JSON对象都使用"properties" JSON对象和其他字段来描述一辆汽车。
    • 当然,每辆汽车可能有一些独特的"id""code""model"名称。
    • 此外,"properties"对象帮助描述了另一组汽车特征。 它包括"color""doors""engine""price""is_electric"字段。

Java代码:

这段代码使用org.json库操作JSON对象。

  1. jsonObject存储整个JSON字符串。
  2. 然后我们将最高级别的对象"cars"存储到jsonArray变量中。
  3. 使用for循环遍历JSON数组并打印每辆汽车的JSON数据。
public static void main(String[] args) throws InterruptedException {
    String carsJson = "insert_your_json"; //TODO

    JSONObject jsonObject = new JSONObject(carsJson);
    JSONArray jsonArray = jsonObject.getJSONArray("cars");
    int length = jsonArray.length();
    for (int i = 0; i < length; i++) {
        printData(jsonArray.getJSONObject(i));
    }
}

private static void printData(JSONObject jsonObject) {
    String message = "Id: %s\nModel: %s\nCode: %s\n" +
            "Properties:\n\tcolor: %s\n\tdoors: %s\n\tengine: %s\n\tprice: %s\n\tis_electric: %s\n\n";
    JSONObject properties = jsonObject.getJSONObject("properties");

    System.out.printf(message, 
            jsonObject.get("id"), jsonObject.get("model"), jsonObject.get("code"),
            properties.get("color"), properties.get("doors"), properties.get("engine"), 
            properties.get("price"), properties.get("is_electric"));
}

输出:

Id: 12
Model: Nissan
Code: 1
Properties:
    color: red
    doors: 4
    engine: best
    price: 500
    is_electric: false

Id: 13
Model: Tesla
Code: 2
Properties:
    color: grey
    doors: 4
    engine: best
    price: 800
    is_electric: true

Id: 14
Model: Kia
Code: 3
Properties:
    color: green
    doors: 4
    engine: diesel
    price: 900
    is_electric: false

-3
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;
      }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接