JSON详解

JSON详解

文章目录

一、简介

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} ]

注意:

  1. JSON的本质就是一串字符串,只不过元素(数据)会使用特定的符号标注
  2. 键和值之间用 " :" 隔开
  3. 键值对之间用 " ," 隔开
  4. 支持无限层嵌套
  5. 单引号''和双引号""都可以表示字符串。

三、序列化和反序列化

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、特点:

  1. 高性能:FastJSON 在序列化和反序列化 JSON 数据时速度非常快,通常比其他 JSON 库更快。
  2. 简单易用:API 设计简洁,使用方便。
  3. 支持多种数据格式:支持 JSON 对象、数组、Map、List 等常见数据结构。
  4. 强大的功能:包括 JSONPath、自动类型识别、循环引用检测等。

3、FastJson对于json格式字符串的解析主要用到了下面三个类:

  1. JSON:FastJSON的解析器,用于JSON格式字符串与JSON对象及javaBean之间的转换
  2. JSONObject:FastJSON提供的json对象
  3. JSONArray:FastJSON提供json数组对象

强大的功能:包括 JSONPath、自动类型识别、循环引用检测等。

3、FastJson对于json格式字符串的解析主要用到了下面三个类:

  1. JSON:FastJSON的解析器,用于JSON格式字符串与JSON对象及javaBean之间的转换
  2. JSONObject:FastJSON提供的json对象
  3. JSONArray:FastJSON提供json数组对象
相关推荐
m0_748236117 分钟前
Calcite Web 项目常见问题解决方案
开发语言·前端·rust
Watermelo61719 分钟前
详解js柯里化原理及用法,探究柯里化在Redux Selector 的场景模拟、构建复杂的数据流管道、优化深度嵌套函数中的精妙应用
开发语言·前端·javascript·算法·数据挖掘·数据分析·ecmascript
m0_7482489421 分钟前
HTML5系列(11)-- Web 无障碍开发指南
前端·html·html5
m0_7482356132 分钟前
从零开始学前端之HTML(三)
前端·html
一个处女座的程序猿O(∩_∩)O2 小时前
小型 Vue 项目,该不该用 Pinia 、Vuex呢?
前端·javascript·vue.js
hackeroink6 小时前
【2024版】最新推荐好用的XSS漏洞扫描利用工具_xss扫描工具
前端·xss
迷雾漫步者7 小时前
Flutter组件————FloatingActionButton
前端·flutter·dart
向前看-7 小时前
验证码机制
前端·后端
燃先生._.9 小时前
Day-03 Vue(生命周期、生命周期钩子八个函数、工程化开发和脚手架、组件化开发、根组件、局部注册和全局注册的步骤)
前端·javascript·vue.js