Introduction of JSON

1 JSON 简介

JSON:JavaScript 对象表示法(JavaScript Object Notation)。

它基于ECMAScript的一个子集,采用完全独立于语言的文本格式。易于人阅读和编写,同时也易于机器解析和生成(一般用于提升网络传输速率)。 类似于 XML,但比 XML 更小、更快,更易解析。是一种理想的数据交换语言。

特点:

  • JSON 指的是 JavaScript 对象表示法(JavaScript Object Notation)
  • JSON 是轻量级的文本数据交换格式
  • JSON 独立于语言
  • JSON 具有自我描述性,易理解

Example:

1
2
3
4
5
6
7
8
9
10
11
12
{
name: "World"
countries: [
{
name: "United States",
capital: "Washington, D.C."
}, {
name: "United Kingdom",
capital: "London"
}
]
}

2 JSON 语法

JSON 语法规则

JSON 语法是 JavaScript 对象表示语法的子集。

  • 数据在键值对中

    “firstName”:”John”

  • 数据由逗号分隔

    “firstName”:”John”, “lastName”:”Lock”

  • 花括号保存对象

    {“firstName”:”John”}

  • 方括号保存数组

    [“id”:1}, {“id”:2}]

JSON 名称/值对

JSON 数据的书写格式是:名称/值对。 名称/值对组合中的名称写在前面(在双引号中),值对写在后面(同样在双引号中),中间用冒号隔开:

"firstName":"John"

等价于这条 JavaScript 语句:

firstName = "John";

JSON 值

JSON 值可以是:

  • 数字(整数或浮点数)

    height: 8848

  • 字符串(在双引号中)

    firstName: “John”

  • 逻辑值(true 或 false)

    is_installed: false

  • 数组(在方括号中)

  • 对象(在花括号中)
  • null

    name: null

即除了以上几种形式的JS对象不是合法的JSON值,如function就不是合法的JSON值

基础结构

JSON结构有两种结构,简单说就是javascript中的对象和数组,所以这两种结构就是对象和数组两种结构,通过这两种结构可以表示各种复杂的结构。

1、对象

对象在js中表示为“{}”括起来的内容,数据结构为 {key:value,key:value,…}的键值对的结构。

在面向对象的语言中,key为对象的属性,value为对应的属性值,所以很容易理解,取值方法为 对象 .key 获取属性值,这个属性值的类型可以是 数字、字符串、数组、对象几种。

2、数组

数组在js中是中括号“[]”括起来的内容,数据结构为 [“java”,”javascript”,”vb”,…],取值方式和所有语言中一样,使用索引获取,字段值的类型可以是 数字、字符串、数组、对象几种。

经过对象、数组2种结构就可以组合成复杂的数据结构了。

3 JSON 使用

3.1 在JavaScript中使用JSON

在JavaScript中,处理JSON不需要任何特殊的API或工具包。

序列化与反序列化

较新的浏览器中,可以通过 JSON.stringifyJSON.parse 来实现序列化和反序列化。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
var world = {
name: "World",
countries: [
{
name: "United States",
capital: "Washington, D.C."
}, {
name: "United Kingdom",
capital: "London"
}
]
};

// Serialization
var str = JSON.stringify(world);
console.log(str);

// Deserialization
var parsedWorld = JSON.parse(str);

访问JSON元素

访问元素

通过 .key 访问对象属性

1
console.log(world.name);

通过 [index] 访问数组元素

1
console.log(world.countries[0]);

遍历元素

通过 for-in 来遍历 JSON 数据

1
2
3
for (var key in world) {
console.log('key: ' + JSON.stringify(world[key]));
}

修改JSON元素

增加元素

通过 obj.key 的方法增加属性

1
2
world.planet = "Earth";
console.log(JSON.stringify(world));

通过 obj[index] 的方法增加数组元素,(index不在已有数组索引范围内)

1
2
3
4
5
world.countries[2] = {
name: "Japan",
capital: "Tokyo"
};
console.log(JSON.stringify(world));

删除元素

通过 delete obj.key 的方式来删除属性:

1
2
delete world.planet;
console.log(JSON.stringify(world));

通过 array.splice 删除数组元素

1
2
world.countries.splice(2, 1);
console.log(JSON.stringify(world));

修改元素

在访问时直接赋新值即可完成修改

3.2 在.NET中使用JSON

在.NET中有三种常用的JSON序列化的类,分别是

  • System.Web.Script.Serialization.JavaScriptSerializer类
  • System.Runtime.Serialization.Json.DataContractJsonSerializer类
  • Newtonsoft.Json.JsonConvert类

定义JSON数据格式类

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
[DataContract]
class Country
{
[DataMember]
public string Name { get; set; }
[DataMember]
public string Captital { get; set; }

public Country()
{

}

public Country (string name, string capital)
{

Name = name;
Captital = capital;
}
}

[DataContract]
class World
{
[DataMember]
public string Name { get; set; }
[DataMember]
public List<Country> Countries {get; set; }

public World()
{

Name = "World";
Countries = new List<Country>();
}
}

static void Main(string[] args)
{

World world = new World();

// Add elements
world.Countries.Add(new Country("United States", "Washington, D.C."));
world.Countries.Add(new Country("United Kingdom", "London"));
}

使用System.Web.Script.Serialization.JavaScriptSerializer

JavaScriptSerializer是.NET自带的处理JSON的类,JavaScriptSerializer类在System.Web.Extensions.dll中,需要添加引用System.Web.Extensions.dll

示例如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
using System.Web.Script.Serialization;
using System.Collections.Generic;
using System;

namespace json
{
class Program
{
static void UseJavaScriptSerializer(World world)
{

// JavaScriptSerializer类在System.Web.Extensions.dll中,需要添加引用System.Web.Extensions.dll
JavaScriptSerializer serializer = new JavaScriptSerializer();

//JSON 序列化
string str = serializer.Serialize(world);
Console.WriteLine("JavaScriptSerializer: after Serialization: {0}, length: {1}", str, str.Length);

//JSON 反序列化
World _world = serializer.Deserialize<World>(str);
Console.WriteLine("JavaScriptSerializer: after Deserialization: Name: {0}, Countries Count: {1}", _world.Name, _world.Countries.Count);
}
}
}

执行后输出:

1
2
3
JavaScriptSerializer: after Serialization: {"Name":"World","Countries":[{"Name":"United States","Captital":"Washington, D.C."},{"Name":"United Kingdom","Captita
l":"London"}]}, length: 131

JavaScriptSerializer: after Deserialization: Name: World, Countries Count: 2

注意:

如果不想序列化某个字段,可以在字段前面加[JsonIgnore]标记。

使用Newtonsoft.Json.JsonConvert

Newtonsoft.Json.JsonConvert类是非微软提供的一个JSON序列化和反序列的开源免费的类库(下载网址是:https://github.com/JamesNK/Newtonsoft.Json/releases),它提供了更灵活的序列化和反序列化控制。并且如果你的开发环境使用的是.NET Framework3.5及以后版本的话,你就可以使用Linq to JSON,只解析出关心的那部分即可,非常方便。

需要下载并添加引用Newtonsoft.Json.dll;

示例如下:

1
2
3
4
5
6
7
//JSON 序列化  
string str = JsonConvert.SerializeObject(world);
Console.WriteLine("SerializeObject: after Serialization: {0}, length: {1}", str, str.Length);

//JSON 反序列化
World _world = JsonConvert.DeserializeObject<World>(str);
Console.WriteLine("JavaScriptSerializer: after Deserialization: Name: {0}, Countries Count: {1}", _world.Name, _world.Countries.Count);

注意:

如果需要序列化实体

1、类名必须添加[DataContract]标记;

2、类属性添加[DataMember]标记;

如果有不需要序列化的字段,可以给该字段添加[JsonIgnore]标记

性能对比

image

其他

对JSON数据的操作(如增加、删除、更新)其实就是对C#类的操作。

4 JSON 小结

JSON文件

  • 通常JSON 文件的文件类型设置为 “.json” ,用于区分其它格式的文本文件。
  • JSON 文本的 MIME 类型是 “application/json”

与 XML 比较

  • 可读性

    JSON: 简易的语法, XML: 规范的标签形式

    不分胜负

  • 可扩展性

    不分胜负

  • 编解码难度

    在JS中,JSON具有优势

  • 数据效率

    JSON不需要有严格的闭合标签,有效数据量与总数据包比大大提升,从而减少同等数据流量的情况下,网络的传输压力

相关链接

在线JSON编辑器:http://www.atool.org/jsoneditor.php

5 Reference

  1. JSON_百度百科, http://baike.baidu.com/link?url=9Xh66e3k3V_8H0GXI2UreQ43jK5tX84PVIT1Bh6tgswhISJG6zzwNRhvryOkvFRp9pyXlJtSUyiId9DaDzHAyK
  2. W3School_JSON教程, http://www.w3school.com.cn/json/index.asp
  3. 在.NET使用JSON作为数据交换格式, fangaoxin, http://blog.csdn.net/fangaoxin/article/details/7618152