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);
1
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"
        }]
    }]
}]
1
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