如何制作具有多个数组的JSON对象?


83

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

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

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

例如

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

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


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

Answers:


160

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

样本数据:

{
    "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}。最外层对象中的任何数据都可以是数组的任何一种,但是最外层对象本身必须使用花括号。
马特·科夫林

我将如何在这里遍历城镇:pastebin.com/qyQ2Y9sn,这样我就可以访问经纬度。
哈里

1
for (var town in markers.towns) { alert(markers.towns[town].lat) }
马特·科夫林

1
没问题,:)我在以上两个示例中都添加了一些遍历JSON数据的示例。
马特·科夫林

21

我正在阅读的好书:Nicholas C. Zakas第三版的Web开发人员专业JavaScript具有以下有关JSON语法的信息:

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

对于您感兴趣的那个,它说:

“数组使用JavaScript中的数组文字表示法以JSON表示。例如,这是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()方法。如果您需要更多信息,请搜索这些术语...或获取该书,其中包含许多示例。


在上面的示例中,“版本”和“年份”应该用引号引起来-jsonlint.co.uk不会通过其他方式进行验证
rexall

2

另一个例子:

[  
[  
    {  
        "@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是什么?
菲利普·柯比布里德

1
@PhilipKirkbride最外层数组的第二个元素?
rootkea

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

在对象内部包含汽车制造商阵列怎么办?因此cars> manufacturer> model, color, doors。(对象内的数组内的数组)
哈里(Harry

-4

使用以下方法传递任何值,该值是任何数组:

输入参数:url,例如:“ / node / [数组的任何int值] / anyKeyWhichInArray”例如:“ cars / Nissan / [0] / model”

它可以用于任何响应:

    public String getResponseParameterThroughUrl(Response r, String url) throws JsonProcessingException, IOException {
    String value = "";
    String[] xpathOrder = url.split("/");
    ObjectMapper objectMapper = new ObjectMapper();
    String responseData = r.getBody().asString();       
    JSONObject jsonObject = new JSONObject(responseData);
    byte[] jsonData = jsonObject.toString().getBytes();
    JsonNode rootNode = objectMapper.readTree(jsonData);
    JsonNode node = null;
    for(int i=1;i<xpathOrder.length;i++) {
        if(node==null)
            node = rootNode;
        if(xpathOrder[i].contains("[")){
            xpathOrder[i] = xpathOrder[i].replace("[", "");
            xpathOrder[i] = xpathOrder[i].replace("]", "");
            node = node.get(Integer.parseInt(xpathOrder[i]));
        }
        else
            node = node.path(xpathOrder[i]);
    }
    value = node.asText();
    return value;
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.