Json完整版介绍和工具类解析应用

21 篇文章 0 订阅

JAVA序列化与JSON数据之间的关系
1.一种轻量级数据交换的文本格式,而不是一种编程语言。
2.采用完全独立于编程语言的文本格式来存储和表示(展示)数据。
3.独立于语言和平台
4.JSON 解析器和 JSON 库支持许多不同的编程语言
总结

JSON 是存储和交换文本信息的一种语法,它与XML具有相同的特性,是一种数据存储格式,
却比 XML 更小、更快、 更易于人编写和阅读、更易于生成和解析。

1.JSON是什么

1.1特性

1.纯文本
2.具有“自我描述性”(人类可读)
3.具有层级结构(值中存在值)
4. 可通过 JavaScript 进行解析
5. 数据可使用 AJAX 进行传输

1.2优点

读写的速度更快
使用数组
能够使用内建的 JavaScript eval() 方法进行解析
没有结束标签
更短
不使用保留字

1.3语法–一切皆对象

字符串、数值、对象、数组等,都可以通过 JSON 来表示。
数据在键/值对中,键/值对可以嵌套
数据由逗号分隔
花括号保存对象,对象可以包含多个键/值对
方括号保存数组,数组可以包含多个对象

JSON不是JavaScript语句,对象的末尾没有分号,对象和数组的最后一个成员后面,也不能加逗号。
1.4键值对要求

键必须是字符串
JSON是由键和值组成,键必须是字符串,
值可以是
字符串(string)
数值(number)
对象(object)
数组(array)
boolean
null

在定义JSON键/值时,先是键名,然后冒号,然后是值。如:
"baidu": "https://www.baidu.com"
这就等价于这条 JavaScript 语句:
baidu = "https://www.baidu.com"

JSON 的字符串(string)跟C或者Java的字符串非常相似,是由双引号包围的任意数量Unicode字符的集合,使用反斜线转义
由于JSON 字符串不能使用单引号,因此一个字符(character)就是一个单独的字符串(character string)。

JSON 数值(number)与C或者Java的数值非常相似,支持整型、浮点型,浮点型也可以用指数表示
{ "id": 001 } { "id": 1.1 } { "id": 10 }

2.JSON实例应用

JSON 对象
JSON 数组
JSON 布尔值
JSON 文件

2.1JSON 对象

1.简单一个json对象
{“baidu”:“www.baidu.com”}
2.对象嵌套
{
“baidu”:“www.baidu.com”,
“CEO”:
{
“name”:“李彦宏”,
“birthday”:19681117
}
}

2.2JSON 元素的集合 —json数组

1.数组内是值的集合,且值之间用逗号分割,每一个值都称之为数组的元素
数组的元素可以是数组、对象.
举例1:元素是对象

[
{\"a\": 1, \"b\": 0, \"c\": 1, \"d\": 31},
{\"a\": 2, \"b\": 11, \"c\": 3, \"d\": 5},
]

举例2:元素是数组

{
"name": "CSDN",
"top": 1,
"netaddress": [ "https://www.csdn.net/", "https://www.csdn.net/?spm=1001.2101.3001.4476" ]
}

举例3:元素是对象和数组混合

[
{\"a\": 1, \"b\": 0, \"c\": 1, \"d\": 31},
{\"a\": 2, \"b\": 11, \"c\": 3, \"d\": 5},
"company": [
{ "firstName":"John" , "lastName":"Doe" },
{ "firstName":"Anna" , "lastName":"Smith" },
{ "firstName":"Peter" , "lastName":"Jones" }
]
]

2.3JSON 文件

JSON 文件的文件类型是 “.json”
JSON 文本的 MIME 类型是 “application/json”

3.前端JSON 和 JS 对象互转

JSON.parse() 和 JSON.stringify()
前者是转换成键值对的形式称之为JSON字符串转换为原生的 JavaScript 值或对象
后者是将对象的键值对形式序列化为JSON字符串格式,以方便存储和数据交换。
如果该对象拥有 toJSON() 方法,那么该 toJSON() 方法就会覆盖该对象默认的序列化行为: 被序列化的不是那个原始对象,而是调用 toJSON() 方法后返回的那个对象。

将字符串对象转换成键值对的形式
JSON.parse()  
var o = JSON.parse('{"name": "周杰伦","identity":"singer"}');
o.name 	 // 周杰伦
o.identity	 // singer
将键值对的形式转换成字符串对象
JSON.stringify()
JSON.stringify({x: 1, y: 2}); // "{"x":1,"y":2}"

3.1JSON.parse() 和 eval()

实际上,eval() 函数的功能类似于 JSON.parse()方法,也可以将json字符串转换为json对象。如:

eval(‘(’ + ‘{“a”:1}’+‘)’).a; //1

JSON.parse(‘{“a”:1}’).a; //1

但是,eval() 函数可以执行不符合 JSON 格式的代码。如:

eval(‘(’ + ‘{“a”:alert(1)}’+‘)’).a; //弹出1

JSON.parse(‘{“a”:alert(1)}’).a; //报错

在浏览器中运行上述代码,eval() 函数就会弹出 alert 框,而 JSON.parse()方法将会报错。由于 eval() 函数会为恶意代码提供可乘之机,因此应当尽量少使用 eval() 函数,而是使用更安全的 JSON.parse()方法。

3.2如何保存json数据到数据库-这里使用Ajax方式

Ajax详解内容
var paramArr =[1,2,3,4]

var  paramArr =[1,2,3,4]
<script type="text/javascript" src="js/jquery-3.5.1.js" ></script>
#这个record象征接收传参
function wait_Dispatch_Function(record){
	var parameter = {id:record.id};
	$.ajax({
		url:"",
		type:"",
		data: paramArr:JSON.stringify(paramArr),
		dataType:"json",	//服务器数据返回类型
		success:function (flag,xhr) {
		。。。。。。
		},
		error:function (xhr,status,info) {alert("获取结果失败",xhr+status+info);}
	})
}

@Controller 后台接收
接口中对应参数 paramArr 应为 String paramArr
@Controller
@RequestMapping(“/xxxxx”)
@ResponseBody
String public receiveDate(String paramArr){

}

4.后端JSON 数据的接收和处理存储数据库

4.1接收JSON数据并进行获取–方式一

接收前台发送的JSON数据并进行处理
前端js将数组数据转化成JSON对象数据字符串,故后端接收以 String类型接收

引入  import net.sf.json.JSONArray;
@Controller
@RequestMapping("/xxxxx")
@ResponseBody
String public  receiveDate(HttpSession session, HttpServletResponse response,String paramArr){	
//将JSON字符串转换成  JSON数组
JSONArray jsonArray = JSONArray.fromObject(paramArr);
//对JSON数组像普通数组一样进行遍历
			for (int i = 0; i < jsonArray.size(); i++) {
			//获取对应JSON数组的某个元素对象进行获取
				Integer num = (Integer) jsonArray.get(i);
				System.out.println(num); //1、2、3、4
				}
}

4.2接收JSON数据直接进行数据库存储–方式二

前提是数据库对应字段设置的数据类型 text、longtext、json等方式
直接将对应字段数据以字符串方式插入数据库表字段中

4.3接收来自数据库的JSON数据并解析获取对象的值

创建一个类中属性含有private String paramArr;
select paramArr from storedata where xxxx
可能 paramArr含有很多 故采用 List paramArrlist 接收

		for (int i = 0; i < paramArrlist.size()  ; i++) {
                   JSONArray jsonArray = JSONArray.fromObject(paramArrlist[i]);
                   for (int i = 0; i < jsonArray.size(); i++) {
                          Map map = (Map) jsonArray.getJSONObject(i);
                             if (map.isEmpty()) {
                                   break;
                              }
				   System.out.println(map.get(xxx));//获取当前遍历json对象的值                        
 }
 }

4.4将处理的数据以JSON对象返回前台js继续处理

key值必须是字符串
引入包 fastjson-1.2.39.jar

import com.alibaba.fastjson.JSONObject;
#data2数据可能list,可能是null,或者其他类型
public  String  sendFrontPage(){
JSONObject jObject = new JSONObject();
		jObject.put("flag", "fail");
		try{
		
		。。。。。。
		
		jObject.put("data1", data1);//key值必须是字符串
		jObject.put("data2", data2);//data2数据可能list,可能是null,或者其他类型
		jObject.put("data3", data3);
		jObject.put("flag", "true");
		}catch(Exection e){
			e.printStackTrace();
			jObject.put("message", "XXX异常情况原因:" + e.toString());
		。。。。。。
		}catch(){
		。。。。。。
		jObject.put("message", "XXX异常情况原因:" + e.toString());
		}catch(){
		。。。。。。
		jObject.put("message", "XXX异常情况原因:" + e.toString());
		}finally(){//无论catch执不执行,finally都会执行
		。。。。。。
		}
		return jObject.toJSONString();
}

4.5处理返回前台的数据接口需要添加注解

@RequestMapping("/XXXXXX")//没有这个注解前台js无法请求后台接口
@ResponseBody   //没有这个注解前台接收不到字符串

4.6前台js接收反馈

其实经过4.4转成json,前台接收的是json字符串

{

"flag":"true"/"false",
"data1":"data1",
"data2":data2,   //value 可能不是字符串可能是整型数值或者list
"data3":data3

}

function sendandreceiveHouTaiResponseFunctionHandle(record){
	var parameter = {id:record.id};
	$.ajax({
		url:"",
		type:"",
		data: paramArr:JSON.stringify(paramArr),
		dataType:"json",	//服务器数据返回类型
		//这个success 是服务器成功应答调的函数  
		success:function (res,xhr) {
		if(res.flag == true){
		//对数据处理
		  console.log(res.data1);
		  console.log(res.data2);
		  console.log(res.data3);
		}
		。。。。。。
		},
	//这个error 是服务器失败应答调的函数  
		error:function (xhr,status,info) {alert("获取结果失败",xhr+status+info);}
	})
}

5前台js请求接口携带多个参数的方式

5.1Js进行请求和接收的准备之一 ----参数聚集成对象

function sendandreceiveHouTaiResponseFunctionHandle(record){
	var parameter = {id:record.id,name:name,age:age,address:address};
	parameter.hobby ="看电影" ;
	parameter.home ="大别野" 
	$.ajax({
		url:"xxx.do",
		type:"post/get/head...",
		data: parameter
		dataType:"json",	//服务器数据返回类型
		//这个success 是服务器成功应答调的函数  
		success:function (res,xhr) {
		if(res.flag == true){
		//对数据处理
		  console.log(res.data1);
		  console.log(res.data2);
		  console.log(res.data3);
		}
		。。。。。。
		},
	//这个error 是服务器失败应答调的函数  
		error:function (xhr,status,info) {alert("获取结果失败",xhr+status+info);}
	})
}

5.1.1后端接口接收和反馈处理的准备 —对象接收

	@RequestMapping("/XXXXXX")//没有这个注解前台js无法请求后台接口
	@ResponseBody   //没有这个注解前台接收不到字符串
	定义一个Person类包含的属性包括 id,name,age,address,hobby,home  
	public String   defineFunction(Person  person){
	。。。。。。。 这个对象就能接收到对象属性被赋值,如果没被赋值为属性的默认值
	}

5.2Js进行请求和接收的准备之二 ----参数分散开

function sendandreceiveHouTaiResponseFunctionHandle(record){
	$.ajax({
		url:"xxx.do",
		type:"post/get/head...",
		data:{
		id:record.id,//最左面的key为id是对应接口的参数 Integer id
		name:name,//最左面的key为name是对应接口的参数 String name
		age:age,
		address:address
		......
		}
		dataType:"json",	//服务器数据返回类型
		//这个success 是服务器成功应答调的函数  
		success:function (res,xhr) {
		if(res.flag == true){
		//对数据处理
		  console.log(res.data1);
		  console.log(res.data2);
		  console.log(res.data3);
		}
		。。。。。。
		},
	//这个error 是服务器失败应答调的函数  
		error:function (xhr,status,info) {alert("获取结果失败",xhr+status+info);}
	})
}

5.2.1后端接口接收和反馈处理的准备 —分散接收

	@RequestMapping("/XXXXXX")//没有这个注解前台js无法请求后台接口
	@ResponseBody   //没有这个注解前台接收不到字符串
	定义一个Person类包含的属性包括 id,name,age,address,hobby,home  
	public String defineFunction(Integer id,String name,Integer age,String address.....){
	。。。。。。。 这些接收的参数必须每个对象才行
	}

6几种常用的JSON解析工具的使用

JSONObject:普通json对象
JSONArray:json数组
(1)fastjson的使用

(2)net.sf.json的使用

(3)json-simple的使用

(4)gson的使用

(5)org.json的使用

7JSON、JSONObject、JSONArray、Map之间的关系

JSONObject中含有多个JSON的键值对
JSONObject对象添加在JSONArray中,JSONArray中包含多个JSONObject对象

JSONObject(JSON对象),就是一个键对应一个值,使用大括号{ }格式如下:

{"name": "李彦宏","address": "中国"}

JSONArray(JSON数组),数组里面的各项也是JSON键值对格式,使用中括号[ ]格式如下:

[{"name": "李彦宏","address": "中国"},{"name": "马云","address": "中国"}]

所以说JSON对象中添加的是键值对,JSON数组中添加的是JSON对象,使用方法如下:

JSONObject jsonobject = new JSONObject();
JSONArray jsonArray = new JSONArray(); 
jsonobject.put("key", "value"/value);//JSONObject对象中添加的是键值对
jsonArray.add(jsonobject);//JSONOArray数组中添加的Json对象

4、JSONObject与Map的联系
Map和JSON都是键值对,Map中键值对中间用等号分开,而JSON中键值对中间用冒号分开。
JSON就是Map的一种特殊形式的,如下:

Map<String,String> strmap=new JSONObject();
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值