JSON
# JSON
[TOC]
# 一、JSON
# 1.1 JSON基本概念
1、javaScript对象表示法(javaScript object notation)
2、json是存储和交换文本信息的语法,类似xml。它使用键值对的方式来组织,易于人们阅读和编写,同时也易于机器解析和生成。
3、json是独立于语言的,也就是说不管什么语言,都可以解析json,只需要按照json的规则来就行。
4、xml也是一种传递信息的方法。
# 1.2 json和xml比较
# 1.2.1 数据体积
JSON 相对于 XML 来讲,数据的体积小。
# 1.2.2 传输速度
JSON 的速度要远远快于 XML。
# 1.2.3 数据交互
JSON 与 JavaScript 的交互更加方便,更容易解析处理,更好的数据交互。
# 1.2.4 数据描述
JSON 对数据的描述性比 XML 较差。
# 1.3 json语法规则
1、json数据的书写格式是:名称/值对。 名称/值对组合中的名称写在前面(在双引号中),值对写在后面(同样在双引号中),中间用冒号隔开,比如 "name":"郭靖"。 和javaScript对象表示法不同,javaScript对象表示法的键值不需要用引号,但是json的键值要用引号。
2、json的值可以是下面这些类型:
(1)数字(整数或浮点数),如123,1.23
(2)字符串(在双引号中)
(3)逻辑值(true或false)
(4)数组(在方括号中)
(5)对象(在花括号中)
(6)null
3、json典型例子: { "staff":[ {"name":"洪七","age":70}, {"name":"郭靖","age":35} ] }
# 1.1(外注)JSON建构于两种结构:
1、“名称/值”对的集合(A collection of name/value pairs)。
不同的语言中,它被理解为对象(object),纪录(record),结构(struct),字典(dictionary),哈希表(hash table),有键列表(keyed list),或者关联数组 (associative array)。
2、值的有序列表(An ordered list of values)。
在大部分语言中,它被理解为数组(array)。
# 1.5 json解析
# 1.5.1 eval()
较危险,不光解析了字符串,还解析了js方法,无论何时用eval()都是非常危险的。
# 1.5.2 JSON.parse()
较好,会解析出错误。
//例子:首先定义了JSON字符串jsondata
eval()方法:
var jsondata='{"staff":[{"name":"洪七","age":70}
,{"name":"郭靖","age":35},{"name":"黄蓉","age":30}]}';
var jsonobj=veal('('+jsondata+')');
alert(jsonobj.staff[0].name); parse()方法:
var jsondata='{"staff":[{"name":"洪七","age":70},{"name":"郭靖","age":35},{"name":"黄蓉","age":30}]}';
var jsonobj=JSON.parse(jsondata);
// alert(jsonobj.staff[0].name); 都可以,若把age后的70改成alert(123);
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
若用eval()方法,发现页面是先弹出123,再弹出洪七;也就是说用eval不仅解析了字符串,还执行了JS里的方法 用parse()解析字符串,发现会抛出一个错误。
这说明用eval()不会看json是否合法,eval非常危险。所以尽量使用JSON.parse方法,来解析json里的字符串,而且还可以解析出json里的一些错误。
# 1.5.3 Json.stringify()
把Javascript对象序列化为JSON字符串。
在序列化JavaScript对象时,所有函数和原型成员都会被有意忽略,不体现在结果中。
此外,undefined的任何属性也都会被跳过。结果中最终都是值为有效JSON数据类型的实例属性。
# 1.6 json校验
工具jsonlint
# 1.7 json格式化
地址:jsonlint.com
# 二、json数组转json tree
let data = [
{
"id": 2,
"title": "0",
"parentId": 0
},
{
"id": 3,
"title": "2",
"parentId": 2
},
{
"id": 4,
"title": "2",
"parentId": 2
},
{
"id": 5,
"title": "4",
"parentId": 4
},
{
"id": 6,
"title": "3",
"parentId": 3
}
];
function jsonTree(data, parentId) {
let res = [];
let len = data.length;
for (var i = 0; i < len; i++) {
if (data[i].parentId == parentId) {
let obj = {};
for (let key in data[i]) {
// 将除了"parentId"的属性存起来
key === "parentId" || (obj[key] = data[i][key])
}
let child = jsonTree(data, data[i].id);
child.length > 0 && (obj.children = child);
res.push(obj);
}
}
return res;
}
let res = jsonTree(data, 0);
console.log(JSON.stringify(res));
// 打印结果
[{
"id": 2,
"title": "0",
"children": [{
"id": 3,
"title": "2",
"children": [{
"id": 6,
"title": "3"
}]
}, {
"id": 4,
"title": "2",
"children": [{
"id": 5,
"title": "4"
}]
}]
}]
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71