1 JSON 简介
JSON:JavaScript 对象表示法(JavaScript Object Notation)。
它基于ECMAScript的一个子集,采用完全独立于语言的文本格式。易于人阅读和编写,同时也易于机器解析和生成(一般用于提升网络传输速率)。 类似于 XML,但比 XML 更小、更快,更易解析。是一种理想的数据交换语言。
特点:
- JSON 指的是 JavaScript 对象表示法(JavaScript Object Notation)
- JSON 是轻量级的文本数据交换格式
- JSON 独立于语言
- JSON 具有自我描述性,易理解
Example:
1 | { |
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.stringify 和 JSON.parse 来实现序列化和反序列化。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19var 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
3for (var key in world) {
console.log('key: ' + JSON.stringify(world[key]));
}
修改JSON元素
增加元素
通过 obj.key 的方法增加属性
1
2world.planet = "Earth";
console.log(JSON.stringify(world));
通过 obj[index] 的方法增加数组元素,(index不在已有数组索引范围内)
1
2
3
4
5world.countries[2] = {
name: "Japan",
capital: "Tokyo"
};
console.log(JSON.stringify(world));
删除元素
通过 delete obj.key 的方式来删除属性:
1
2delete world.planet;
console.log(JSON.stringify(world));
通过 array.splice 删除数组元素
1
2world.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 | [DataContract] |
使用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
23using 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
3JavaScriptSerializer: 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]标记
性能对比
其他
对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
- JSON_百度百科, http://baike.baidu.com/link?url=9Xh66e3k3V_8H0GXI2UreQ43jK5tX84PVIT1Bh6tgswhISJG6zzwNRhvryOkvFRp9pyXlJtSUyiId9DaDzHAyK
- W3School_JSON教程, http://www.w3school.com.cn/json/index.asp
- 在.NET使用JSON作为数据交换格式, fangaoxin, http://blog.csdn.net/fangaoxin/article/details/7618152