我以前从没用过JSON,所以对其语法不熟悉。
现在我有多个包含不同数据片段的数组。
我想创建一个JSON对象,其中包含多个数组,每个数组都有几个数据片段。
例如:
一个名为 cars 的对象,包含多个数组,每个数组代表不同品牌的汽车。每个数组中都会有汽车型号和其他一些数据类型(比如车门数量,这只是一个虚构的例子)。
如果有人能给出带有示例的语法解释,将不胜感激。
我以前从没用过JSON,所以对其语法不熟悉。
现在我有多个包含不同数据片段的数组。
我想创建一个JSON对象,其中包含多个数组,每个数组都有几个数据片段。
例如:
一个名为 cars 的对象,包含多个数组,每个数组代表不同品牌的汽车。每个数组中都会有汽车型号和其他一些数据类型(比如车门数量,这只是一个虚构的例子)。
如果有人能给出带有示例的语法解释,将不胜感激。
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数组中的所有字符串值也必须用双引号括起来。
参见:
[0,1,2]
,而关联数组使用花括号 {x:1,y:2,z:3}
。最外层对象中的任何数据都可以是这两种类型的数组,但最外层对象本身必须使用花括号。 - Matt Coughlinfor (var town in markers.towns) { alert(markers.towns[town].lat) }
- Matt Coughlindata.cars['Nissan'][2].doors
应该是 data.cars['Nissan'][1].doors
。我无法编辑答案,因为我至少需要编辑6个字符。 - Luca我正在阅读的一本好书是《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()方法。如果需要更多信息,请搜索这些术语...或者获取该书,它有许多示例。
[
[
{
"@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
});
var cars = [
manufacturer: [
{
color: 'gray',
model: '1',
nOfDoors: 4
},
{
color: 'yellow',
model: '2',
nOfDoors: 4
}
]
]
cars
> manufacturer
> model, color, doors
。(即对象内的数组中嵌套了另一个数组) - Harry{
"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"
字段。这段代码使用org.json
库操作JSON对象。
jsonObject
存储整个JSON字符串。"cars"
存储到jsonArray
变量中。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
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;
}