JSON详解
文章目录
- JSON详解
-
- 一、简介
- 二、JSON的数据表示
- 三、序列化和反序列化
- 四、浏览器中处理JSON
-
- [1 、JSON字符串 → 对象](#1 、JSON字符串 → 对象)
- [2、对象 → JSON字符串](#2、对象 → JSON字符串)
- 五、FastJSON
一、简介
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人类读写,也易于机器解析和生成。JSON 基于 JavaScript 语言的一个子集,但独立于编程语言,可以被多种语言解析和生成,包括 Java、Python、C++ 等。
现在传输数据的方式更多是采用json的格式,渐渐代替了XML
理解:JSON是一种表示对象的方式,用来传输数据的一种格式。
二、JSON的数据表示
JSON 使用名值对(key-value pairs)的方式来表示数据。每个名值对由一个键和一个对应的值组成,键和值之间使用冒号 :
分隔,多个名值对之间使用逗号 ,
分隔。名值对通常用于对象中,使用花括号 {}
包围。
符号 | 描述 | 示例 |
---|---|---|
{} | 表示对象 | {name : '小雷' , age:23} |
[{},{},{}] | 表示对象数组 | [ {name : '小雷' , age:23} , {name : '小杨' , age:22} ] |
注意:
- JSON的本质就是一串字符串,只不过元素(数据)会使用特定的符号标注
- 键和值之间用 " :" 隔开
- 键值对之间用 " ," 隔开
- 支持无限层嵌套
- 单引号''和双引号""都可以表示字符串。
三、序列化和反序列化
JSON的序列化和反序列化是将对象和JSON字符串相互转换的过程。序列化是将对象转换为JSON字符串,反序列化是将JSON字符串转换为对象。
1、序列化
序列化(Serialization)是将对象转换为JSON字符串的过程。这在需要将数据传输到Web服务器或存储到文件时非常有用。
java
var obj = { name: "John", age: 30, city: "New York" };
var jsonString = JSON.stringify(obj);
console.log(jsonString); // {"name":"John","age":30,"city":"New York"}
2、反序列化
反序列化(Deserialization)是将JSON字符串转换回对象的过程。这在从Web服务器接收数据或从文件读取数据时非常有用。
java
var jsonString = '{"name":"John","age":30,"city":"New York"}';
var obj = JSON.parse(jsonString);
console.log(obj.name); // John
理解:
- 序列化 将对象转换为 JSON 字符串,适用于数据传输和存储。
- 反序列化 将 JSON 字符串转换为对象,适用于从数据源读取数据。
四、浏览器中处理JSON
1 、JSON字符串 → 对象
1.1 使用JSON.parse()
函数将JSON格式字符串解析为JavaScript对象 :
html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
</head>
<body>
<script type="text/javascript">
//json格式的字符串
//坑:使用parse解析json格式的字符串,该字符串必须使用单引号包裹着双引号
var jsonStr = '{"name":"你好啊,小雷","age":23}';
//将json格式的字符串转换为js对象
var jsObj = JSON.parse(jsonStr);
alert(jsObj.name + "--"+jsObj.age);
</script>
</body>
</html>
注意:(有坑)
1. 字符串的数据格式:所有属性必须用双引号引住,因为使用JSON.parse需严格遵守JSON规范。
2. 单引号与双引号 :使用单引号嵌套双引号的方式 ' '{"name":"你好啊,小雷","age":23}';
1.2 使用JSON.eval()
函数将JSON格式字符串解析为JavaScript对象
原因:使用JSON.parse()来解析JSON字符串,需要注意的是被转化的字符串里面的属性要使用引号,并且总体是单引号套双引号的方式,太麻烦了。 如果使用eval() 就可以忽略上述两点需要注意的地方
html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
</head>
<body>
<script type="text/javascript">
//json格式的字符串
//坑:eval去解析json格式的字符串,必须使用小括号括起来,
var jsonStr ="[{'name':'你好啊,小雷','age':23},{'name':'你好啊,小杨','age':22}]" ;
//将json格式的字符串转换为js数组
var jsArr = eval(jsonStr);
for(var i=0;i<jsArr.length;i++){
var jsObj = jsArr[i];
alert(jsObj.name + "--"+jsObj.age);
}
</script>
</body>
</html>
理解:eval(str)会将函数的参数作为JavaScript代码去执行
注意:(还是有坑)
使用()包裹JSON字符串
"[{'name':'你好啊,小雷','age':23},{'name':'你好啊,小杨','age':22}]"
原因:eval本身的问题。 由于json是以"{}"的方式来开始以及结束的。在JavaScript中,它会被当成一个语句块来处理,所以必须强制性的将它转换成一种表达式。加上圆括号的目的是迫使eval函数在处理JavaScript代码的时候强制将括号内的表达式转化为对象,而不是作为代码来执行。
2、对象 → JSON字符串
2.1 js对象转JSON
html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
</head>
<body>
<script type="text/javascript">
//js对象
var love1 = new Object();
love1.name = "你好啊,小雷"
love1.age = 23;
var love2 = new Object();
love2.name = "你好啊,小杨"
love2.age = 23;
//js数组
var jsArr = [love1,love2];
//将js数组转json格式的字符串
var jsonStr = JSON.stringify(jsArr);
alert(jsonStr);
</script>
</body>
</html>
2.2 JS数组转JSON
html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
</head>
<body>
<script type="text/javascript">
//js对象
var book = new Object();
book.name = "你好啊,小雷";
book.age = 23;
//将js对象转json格式的字符串
var jsonStr = JSON.stringify(book);
alert(jsonStr);
</script>
</body>
</html>
五、FastJSON
1、定义:FastJson:阿里的开源框架,被不少企业使用,是一个极其优秀的Json框架,使用此框架必须在项目中导入框架包(fastjson-1.1.33.jar), 它提供了快速的 JSON 序列化和反序列化功能。
2、特点:
- 高性能:FastJSON 在序列化和反序列化 JSON 数据时速度非常快,通常比其他 JSON 库更快。
- 简单易用:API 设计简洁,使用方便。
- 支持多种数据格式:支持 JSON 对象、数组、Map、List 等常见数据结构。
- 强大的功能:包括 JSONPath、自动类型识别、循环引用检测等。
3、FastJson对于json格式字符串的解析主要用到了下面三个类:
- JSON:FastJSON的解析器,用于JSON格式字符串与JSON对象及javaBean之间的转换
- JSONObject:FastJSON提供的json对象
- JSONArray:FastJSON提供json数组对象
强大的功能:包括 JSONPath、自动类型识别、循环引用检测等。
3、FastJson对于json格式字符串的解析主要用到了下面三个类:
- JSON:FastJSON的解析器,用于JSON格式字符串与JSON对象及javaBean之间的转换
- JSONObject:FastJSON提供的json对象
- JSONArray:FastJSON提供json数组对象