Json完整版介绍和工具类解析应用
admin
2024-03-29 19:29:55
0

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

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

目录

  • 1.JSON是什么
    • 1.1特性
      • 1.2优点
        • 1.3语法--一切皆对象
          • 1.4键值对要求
  • 2.JSON实例应用
    • 2.1JSON 对象
      • 2.2JSON 元素的集合 ---json数组
    • 2.3JSON 文件
  • 3.前端JSON 和 JS 对象互转
    • 3.1JSON.parse() 和 eval()
    • 3.2如何保存json数据到数据库-这里使用Ajax方式
  • 4.后端JSON 数据的接收和处理存储数据库
    • 4.1接收JSON数据并进行获取--方式一
    • 4.2接收JSON数据直接进行数据库存储--方式二
    • 4.3接收来自数据库的JSON数据并解析获取对象的值
    • 4.4将处理的数据以JSON对象返回前台js继续处理
    • 4.5处理返回前台的数据接口需要添加注解
    • 4.6前台js接收反馈
  • 5前台js请求接口携带多个参数的方式
    • 5.1Js进行请求和接收的准备之一 ----参数聚集成对象
      • 5.1.1后端接口接收和反馈处理的准备 ---对象接收
    • 5.2Js进行请求和接收的准备之二 ----参数分散开
      • 5.2.1后端接口接收和反馈处理的准备 ---分散接收
  • 6几种常用的JSON解析工具的使用
  • 7JSON、JSONObject、JSONArray、Map之间的关系

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]

#这个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: parameterdataType:"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 idname:name,//最左面的key为name是对应接口的参数 String nameage: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 strmap=new JSONObject();

相关内容

热门资讯

长鑫科技下周一上市,发行价为8... 来源:@财联社APP微博 财联社7月23日讯,今日晚间,长鑫科技今日发布公告称,公司股票将于2026...
数字人民币开启从“可用”到“好... 证券时报记者 李颖超 当钱包开立规模持续扩容、试点版图不断铺开之后,数字人民币开始尝试切换发展逻辑。...
收评:超4200只个股上涨!电... 每经编辑:彭水萍 7月23日,A股全天走出缩量修复行情,三大指数小幅收红,盘面黄白线分化明显,中小盘...
商务部:将加快修订出台关于外国... 【大河财立方消息】7月23日,国务院新闻办公室举行新闻发布会,介绍2026年上半年商务工作及运行情况...
「AI新世代」智谱算力出鞘:1... 本报(chinatimes.net.cn)记者石飞月 北京报道 这段时间,智谱的股价经历了一番大起大...
刚刚,封死涨停!16.8亿抢筹... 调整已久的碳酸锂火了! 7月23日,锂矿概念持续走强,*ST威领、川能动力、盛新锂能、永杉锂业、国城...
原创 家... 家庭存款高于多少,才算是国内富裕家庭?社会各界看法不一。有人觉得在国内存款超过1000万,才算是富裕...
事关外贸、消费、新能源等领域 ... 商务部今天发布2026年上半年商务工作及运行情况。 商务部副部长鄢东介绍,上半年商务发展总体情况,...
专访美联储前高级经济学家胡捷 每经记者|周逸斐 每经编辑|廖 丹 法国经济预期增长从0.9%下调为0.6%;德国从0.8%下调为0...
90后接盘清北顶流,仅当3个月... *此图由AI生成 作者| 史大郎&猫哥 来源| 是史大郎&大猫财经Pro 今天讲一个非常生猛的资本游...
罕见反超,GDP十强省份又变了 各省份经济半年报陆续公布,备受关注的十强卡位战正式迎来变局。 今年上半年,安徽以27370亿元GDP...
ETF热门榜:中证短融相关ET... 2026年7月22日,非货币类ETF合计成交5510.77亿元,其中有103只ETF成交额破10亿元...
中国银行 :完成发行300亿元... 中国银行发布公告,公司于2026年7月20日在全国银行间债券市场发行减记型无固定期限资本债券,并于2...
中国真的是五省三市养活全国吗? 近几年,网上流传了一个说法,叫“五省三市养全国”。 简单来说,就是2022年,全国仅广东、江苏、浙江...
摩通:华尔街银行业绩强劲提振欧... 观点网讯:7月22日,华尔街大型银行第二季度业绩表现强劲,提振了市场对欧洲投资银行即将开启的财报季的...
广州拟推动房地产纾困和发展 引... 观点网讯:7月22日,“十五五”时期,广州拟切实推动房地产纾困和发展,引导房地产市场企业转型升级。 ...
AI投入成“无底洞”?谷歌资本... 隔夜美股三大指数集体收低,道琼斯工业指数下跌0.01%报52218.58点,标普500指数跌0.14...
新太空经济从“起势”迈向“成势... 当前,全球正处于新一轮科技革命和产业变革加速演进的关键节点,人工智能、合成生物学、固态电池、高端算力...
金价四连涨,水贝又挤满人 每经记者:赵景致 每经编辑:何小桃,廖丹 记者|赵景致 编辑|何小桃 廖丹杜恒峰校对|金冥羽 金价在...
专访微亿智造董事长张志琦:在“... 本报(chinatimes.net.cn)记者石飞月 上海报道 在刚刚过去的2026世界人工智能大会...