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();

相关内容

热门资讯

贷款也“拼团” 银行抢单忙 购物能“拼团”,贷款也能! 近日,一场“拼团融资”的银企对接活动在省工业和信息化厅拉开帷幕。 “贷款...
逛花展、赶市集、嗨直播!202... 5月23日 “2026北京直播电商购物月” 在丰台区丽泽金融商务区·2026北京国际花展 正式拉开帷...
2026中关村毕业季|AI“吃... “上帝会掷骰子吗?” 在联想未来中心的“与智者同场”展区,一位海淀学子对着屏幕问道。 爱因斯坦微微前...
原创 今... 今日为5月23日,国际现货黄金价格在4500美元/盎司整数关口附近徘徊不前,日内最低触及4480美元...
三连亏后变为“无主”状态,农尚... 从吴亮手中接盘农尚环境(300536)不足三年后,林峰如今让出了公司控制权,上市公司进入“无主”状态...
55岁湖南女首富出手!豪掷13... 快科技5月24日消息,与马斯克、库克并肩而坐,刚参加完国宴的湖南女首富周群飞就买了家上市企业。 近日...
外资加仓A股,岂是跟风这么简单... 熬过忙碌的交易日,在周末安静时段,理清接下来布局方向。本篇为大家准备了5条要闻,涵盖市场动态、行业变...
原创 俄... 在全球能源的残酷牌桌上,手里攥着石油,腰杆子才能硬气。长期以来,中东的沙漠、俄罗斯的冰原、美国的页岩...
喜力啤酒有产品将涨价,华润啤酒... 来源:红星新闻 红星资本局5月22日消息,今日,红星资本局从雪花啤酒(厦门)有限公司、华润啤酒方面获...
原创 金... 心理预期调整刻不容缓,五月二十二日,黄金价格或将重现十五年前的历史性低迷。 近期若您密切关注着黄金市...
原创 马... 埃隆·马斯克如果能让SpaceX实现“科幻小说”级别的目标,他可能获得1万亿美元的收入。 埃隆·马斯...
涨涨涨!放开限制、可加杠杆!这... 韩国股市站在风口上! 据最新消息,为吸引更多海外资金进入股市,韩国政府计划放开限制,允许境外投资者直...
下周9家上会丨科创板首单IPO... IPO及再融资上会预告 据交易所官网审核动态信息,下周(5.25-5.29)IPO上会审核6家企业,...
富途、老虎市值蒸发1/4!或被... 来源:金融时报 5月22日,中国证监会宣布依法对Tiger Brokers (NZ) Limited...
马爸爸的好兄弟钱多多搞了杀猪盘... *此图由AI生成 作者| 史大郎&猫哥 来源| 是史大郎&大猫财经Pro 上周四,港股经纬天地大崩盘...
原创 壳... 编辑:XL 国际能源圈最近炸开了锅,壳牌这家百年石油巨头在2026年3月与委内瑞拉政府正式签署多项油...
存储热潮愈演愈烈!奖金拿到手软... 财联社5月24日讯(编辑 卞纯)在席卷全球的存储芯片热潮中,韩国“存储芯片双雄”SK海力士和三星无疑...
揽牌、合作、生态,跨境支付头部... 近日,国内头部跨境支付机构密集落地海外重要布局,一方面,连连数字、PingPong两家公司相继在中东...
原创 帮... 老铁们,周末好!我是帮主郑重。刚扫了一眼下周的财经日历,好家伙,事件一个接一个,堪称“消息面轰炸周”...
海南省住建厅与中国石化海南石油... 5月22日,中国石化海南石油分公司代表、党委书记李新强、总经理蔡文东一行赴海南省住建厅拜访交流。省住...