JSON
1. 什么是JSON
- JSON 指的是 JavaScript 对象表示法(JavaScript Object Notation)
- JSON 是轻量级的文本数据交换格式
- JSON 独立于语言:JSON 使用 Javascript语法来描述数据对象,但是 JSON 仍然独立于语言和平台
- JSON 具有自我描述性,更易理解(JSON 是基于Javascript的对象进行描述的, 它的每一组值都是键值对组成,它的键就是相当于描述对象的属性,我们可以很好的通过键来看到它表述的是什么意思,所以Json具有自我描述性,也很容易被理解)
2.JSON语法
2.1 JSON 是基于Javascript对象字面量
- JSON 基于Javascript 对象字面量(对象中可能包括函数,但是,JSON 的核心就是交换数据,所以不包括函数)中表示属性的语法。
- 这种属性的表示法是通过键—值来实现的。
- 字面量:指字面意思与其想要表达的意思是完全一致的值。
- 键—值:指拥有名称和对应的值的属性
2.2 JSON 语法
-
在JSON键值对中,键始终被双引号包裹
-
在JSON键值对中,值可以是字符串、数字、布尔值、null、对象、或者数组。
-
JSON中的键值对被花括号包裹。
-
在JSON中,多个键值对之间使用逗号分隔。
-
JSON语法就是告诉机器怎么去读取数据的
- { (左花括号) 指 开始读取对象
- } (右花括号) 指 结束读取对象
- [ (左方括号) 指 开始读取数组
- ] (右方括号) 指 结束读取数组
- : (冒号) 在键值对中分隔键和值
- , (逗号) 用来分隔键值对 或者 数组中的值,也可以认为是一个新的开始
-
JSON 文件的文件类型是 .json
-
当你在传输数据的时候你要告诉对方你传输的是什么数据类型,这个时候就要使用媒体类型了,JSON 文本的 MIME 类型是 application/json
3. JSON数据类型
3.1 JSON数据类型介绍
- 对象
- 字符串
- 数字
- 布尔值
- null
- 数组
3.2 对象类型
-
JSON也是一个对象,一个被花括号包裹的名称。JSON是JavaScript的子集,可以使用Javascript 访问对象的方式进行访问JSON对象,可以使用打点的方式或中括号的方式进行访问。
-
对象类型是使用逗号分隔的名称-值对构成的集合,并使用花括号进行({})包裹。
-
实例:
var myobj={ "name":"runoob", "alexa":10000, "site":null } /*-----访问对象值------*/ var x=myobj.name; // 打印出runoob var y=myobj["name"]; //打印出runoob /*-----循环对象------*/ //使用for-in 来循环对象的属性 for(var item in myobj) { console.log(item.toString()); }
-
嵌套Json值
var myObj = { "name":"runoob", "alexa":10000, "sites": { "site1":"www.runoob.com", "site2":"m.runoob.com", "site3":"c.runoob.com" } } //访问值 x = myObj.sites.site1; x = myObj.sites["site1"]; //修改值 myObj.sites.site1 = "www.google.com"; myObj.sites["site1"] = "www.google.com"; /*删除对象属性,使用delete关键字来删除Json对象的属性*/ delete myObj.sites.site1; delete myObj.sites["site1"]
3.3 数组类型
-
定义数组类型
JSON 数组是值的集合或者列表,每个值都可以是字符串、数字、布尔值、对象或者数组中的任何一种,数组必须使用方括号([])包裹,且值与值之间用逗号隔开
[ "Google", "Runoob", "Taobao" ]
-
注意事项
- JSON 中数组值必须是合法的 JSON 数据类型(字符串, 数字, 对象, 数组, 布尔值或 null)
- JSON数组中的数据类型可以不是同一种
-
实例
var myobj={ "name":"网站", "num":3, "sites":[ "Google", "Runoob", "Taobao" ] } //访问Json数组,我们可以像访问JS数组一样使用下标进行访问 x = myObj.sites[0]; //循环数组,使用for-in访问 for (var item in myObj.sites) { console.log(item); } //或者使用for循环 for (i = 0; i < myObj.sites.length; i++) { console.log(myObj.sites[i]); }
-
嵌套JSON对象中的数组
/*JSON 对象中数组可以包含另外一个数组,或者另外一个 JSON 对象*/ var myObj = { "name":"网站", "num":3, "sites": [ { "name":"Google", "info":[ "Android", "Google 搜索", "Google 翻译" ] }, { "name":"Runoob", "info":[ "菜鸟教程", "菜鸟工具", "菜鸟微信" ] }, { "name":"Taobao", "info":[ "淘宝", "网购" ] } ] } //使用for-in访问嵌套数组 for (i in myObj.sites) { console.log(myObj.sites[i].name); for (j in myObj.sites[i].info) { console.log (myObj.sites[i].info[j]); } } //修改数组值,使用下标来修改数组 myObj.sites[1] = "Github"; //使用delete关键字来删除数组的值 delete myObj.sites[1];
3.4 字符串类型
- JSON中的字符串类型
- 一个字符串值,如:“ssr”,使用双引号包裹
3.5 布尔类型
- JSON中的布尔类型
- true 或false
- JSON中布尔类型只有true和false,且所有字母必须小写
3.6 数字类型
- JSON中的数字类型
- 一个数字值,如42,可以是正整数、负整数、小数或指数
3.7 null类型
- JSON中的null类型
- Javascript中undefined是在尝试获取一些不存在的对象或者变量时返回的结果
- 在Javascript中,undefined与那些声明的名称和值都不存在的对象或变量有关,而null则仅仅与对象或变量的值有关。
- null表示一个“没有的值”,在Json中null必须使用小写。
4.JSON 转换
4.1. eval() 函数介绍
-
通常我们从服务器收到的消息都是一个字符串,我们要将字符串转为一个JSON对象,eval()可以很好的实现这个功能。
-
eval() 函数的问题是,它会将传入的字符串会无差别的执行。如果在字符串添加了恶意代码这会造成不可挽回的损失。
-
实例
var jsonString="alert('this is bad')"; var myObjecr=eval("("+jsonString+")"); //这个时候会执行alert('this is bad');
-
为了解决这个问题,推出了JSON解析器,使用 JSON 解析器将 JSON 转换为 JavaScript 对象是更安全的做法。JSON 解析器只能识别 JSON 文本,而不会编译脚本。
4.2.JSON解析器中的函数
4.2.1 JSON.parse() 函数
-
JSON 通常用于与服务端交换数据。在接收服务器数据时一般是字符串。我们可以使用 JSON.parse() 方法将数据转换为 JSON 对象。
-
语法
JSON.parse(text[, reviver]) 参数说明: text:必需, 一个有效的 JSON 字符串。 reviver: 可选,一个转换结果的函数, 将为对象的每个成员调用此函数。
-
实例
// 从服务器收到的JSON字符串 { "name":"runoob", "alexa":10000, "site":"www.runoob.com" } //将一个JSON字符串转为一个JSON对象 var obj = JSON.parse('{ "name":"runoob", "alexa":10000, "site":"www.runoob.com" }');
4.2.2 JSON.stringify() 函数
-
JSON 通常用于与服务端交换数据。在向服务器发送数据时一般是字符串。我们可以使用 JSON.stringify() 方法将 JavaScript 对象转换为字符串。
-
语法
JSON.stringify(value[, replacer[, space]]) 参数说明: value: 必需, 要转换的 JavaScript 值(通常为对象或数组)。 replacer: 可选。用于转换结果的函数或数组。 如果 replacer 为函数,则 JSON.stringify 将调用该函数,并传入每个成员的键和值。使用返回值而不是原始值。如果此函数返回 undefined,则排除成员。根对象的键是一个空字符串:""。 如果 replacer 是一个数组,则仅转换该数组中具有键值的成员。成员的转换顺序与键在数组中的顺序一样。当 value 参数也为数组时,将忽略 replacer 数组。 space: 可选,文本添加缩进、空格和换行符,如果 space 是一个数字,则返回值文本在每个级别缩进指定数目的空格,如果 space 大于 10,则文本缩进 10 个空格。space 也可以使用非数字,如:\t。
-
实例
var obj = { "name":"runoob", "alexa":10000, "site":"www.runoob.com"}; //转为Json字符串 var myJSON = JSON.stringify(obj);
-
注意事项:
- JSON 不能存储Date类型的数据,JSON.stringify() 会将所有日期转换为字符串
- JSON 不允许包含函数,JSON.stringify() 会删除 JavaScript 对象的函数,包括 key 和 value
5. 服务端的JSON
5.1 C#序列化 JSON和反序列化JSON
- 在web开发的过程中,经常使用数据交换格式就是JSON
- 在C#中操作JSON并不像JavaScript中的那么简单,我们必须要引入一个第三方库NewtonSoft 来帮助我们解析JSON
- 在第三方库中提供了两个方法JsonConvert.SerializeObject 和JsonConvert.DeserializeObject 来对对象进行序列化和反序列化。
- 使用这个两个方法的时候需要创建对应的实体类,如果是值就可以不必创建了。
5.1.1 序列化JSON
//新建一个user的实体类
class User
{
public string Name { get; set; }
public int Age { get; set; }
public string Sex { get; set; }
}
//序列化对象
static void Main(string[] args)
{
List<User> users = new List<User>();
for (int i=0;i<10;i++)
{
User user = new()
{
Name = "张三" + i,
Sex = i % 2 == 0 ? "男" : "女",
Age = 21 + i
};
users.Add(user);
}
//序列化对象
string str= JsonConvert.SerializeObject(users);
Console.WriteLine(str);
}
/*--------------------输出结果-------------------*/
[{"Name":"张三0","Age":21,"Sex":"男"},{"Name":"张三1","Age":22,"Sex":"女"},{"Name":"张三2","Age":23,"Sex":"男"},{"Name":"张三3","Age":24,"Sex":"女"},{"Name":"张三4","Age":25,"Sex":"男"},{"Name":"张三5","Age":26,"Sex":"女"},{"Name":"张三6","Age":27,"Sex":"男"},{"Name":"张三7","Age":28,"Sex":"女"},{"Name":"张三8","Age":29,"Sex":"男"},{"Name":"张三9","Age":30,"Sex":"女"}]
5.1.2 反序列化JSON
//将上面的转换的JSON字符串转为一个对象列表
static void Main(string[] args)
{
List<User> users = null;
string str = "[{\"Name\":\"张三0\",\"Age\":21,\"Sex\":\"男\"},{\"Name\":\"张三1\",\"Age\":22,\"Sex\":\"女\"},{\"Name\":\"张三2\",\"Age\":23,\"Sex\":\"男\"},{\"Name\":\"张三3\",\"Age\":24,\"Sex\":\"女\"},{\"Name\":\"张三4\",\"Age\":25,\"Sex\":\"男\"},{\"Name\":\"张三5\",\"Age\":26,\"Sex\":\"女\"},{\"Name\":\"张三6\",\"Age\":27,\"Sex\":\"男\"},{\"Name\":\"张三7\",\"Age\":28,\"Sex\":\"女\"},{\"Name\":\"张三8\",\"Age\":29,\"Sex\":\"男\"},{\"Name\":\"张三9\",\"Age\":30,\"Sex\":\"女\"}]";
//反序列化对象,从上面的值可以看出来,我们这是一个JSON数组,
//数组里面每一个元素都是一个User对象,所以他应该转为一个user数组对象,
//也可以使用list进行接收,如果是一个对象的应该转为一个User对象
users = JsonConvert.DeserializeObject<List<User>>(str);
foreach (var item in users)
{
Console.WriteLine(item);
}
}
5.2 Linq to JSON
-
Linq to Json是用来快速操作json对象的,包括:查询,修改和创建操作
-
一些相关的类
类名 说明 JObject 用于操作JSON对象 JArray 用于操作JSON数组 JProPerty 表示对象中的属性,以key/value形式表示 JToken 用于存放Linq to Json查询后的结果 -
常见方法
方法 说明 JObject.Parse(string json) 将一个json字符串转为一个JObject对象,通过[" 属性名 "]去访问值 JObject.FromObject (object o) 将一个对象转换为一个JObject对象 JArray.Parse(string json) 将一个json字符串转为一个JArray对象,通过下标去访问数组中的值 -
上面两个方法虽然也能操作JSON,但是他必须创建对应的实体类,Linq to JSON 可以不创建实体类就去操作JSON
-
实例
string json = "{\"Name\":\"wolfy\",\"Age\":25,\"Colleagues\":[{\"Name\":\"Tom\",\"Age\":24},{\"Name\":\"Jack\",\"Age\":22}]}"; //将json转换为JObject JObject jobj = JObject.Parse(json); //通过属性名或者索引来访问,只访问了Colleagues之外的Age属性的值,而不是所有的Age的值 JToken ageToken = jobj["Age"]; //修改 jobj["Age"] = 26; //删除 jobj.Remove("Colleagues"); Console.WriteLine(ageToken.ToString());
-
实例
static void Main(string[] args) { string str = "[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]"; JArray jArray = JArray.Parse(str); //添加 jArray.Add(100); //修改 jArray[0] = 10; //删除 Console.WriteLine(jArray.Remove(jArray[0])); //查询 JToken value= jArray[2]; Console.WriteLine(value.ToString()); //遍历 foreach (var item in jArray) { Console.WriteLine(item.ToString()); } }