一、什么是JSON
JSON:JavaScript 对象表示法(JavaScript Object Notation)
a、JSON 是轻量级的文本数据交换格式
b、JSON 具有自我描述性,更易理解
c、JSON 使用 JavaScript 语法来描述数据对象,但是 JSON 仍然独立于语言和平台
d、JSON 解析器和 JSON 库支持许多不同的编程语言。
- 相比XML优点
没有结束标签
更短
读写的速度更快
能够使用内建的 JavaScript eval() 方法进行解析
使用数组
不使用保留字
二、语法规则
数据在名称/值对中
数据由逗号分隔
花括号保存对象
方括号保存数组
- JSON 名称/值对
JSON 数据的书写格式是:名称/值对
名称/值也可以叫键/值或key/value
"firstName" : "John"
等同于js
firstName = "John"
- JSON 值
数字(整数或浮点数)
字符串(在双引号中)
逻辑值(true 或 false)
数组(在方括号中)
对象(在花括号中)
null
- JSON 对象
JSON 对象在花括号中书写,对象可以包含多个名称/值对
{ "firstName":"John" , "lastName":"Doe" }
等同于js
firstName = "John"
lastName = "Doe"
- JSON 数组
JSON 数组在方括号中书写,可以用数组包含多个对象,
{
"employees": [
{ "firstName":"John" , "lastName":"Doe" },
{ "firstName":"Anna" , "lastName":"Smith" },
{ "firstName":"Peter" , "lastName":"Jones" }
]
}
- 数组与对象的关系
a、一个对象可以包含多个名称/值对,用","隔开
b、一个对象也可以包含多个JSON 数组,用","隔开
c、名称/值对与数组之间用","隔开
d、一个对象中也可以包含另一个对象
{
"key": [{ "key":"value" , "key":"value" },{ "key":"value" , "key":"value" }],//数组
"key":"value" ,//数据
"key":"value" ,//数据
"key": [{ "key":"value" , "key":"value" }],//数组
"key":{"key","value"}//对象
}
三、JSON与JavaScript
因为 JSON 使用 JavaScript 语法,所以 在JavaScript 中的可以直接使用 JSON。
- json对象
- json数组
定义
var employees = [ { "firstName":"Bill" , "lastName":"Gates" }, { "firstName":"George" , "lastName":"Bush" }, { "firstName":"Thomas" , "lastName": "Carter" } ];
访问
employees[0].lastName;
修改
employees[0].lastName = "Jobs";
添加
employees[0]["name"] = "Jobs"; employees[0].name = "Jobs";
添加数组
employees.push(json)
删除
delete employees[0].firstname
删除数组
employees.splice(1)
转换为字符串
在linux下出现过不可使用的问题
var str = JSON.stringify(json);
- json文本
定义
var txt = '{ "employees" : [' + '{ "firstName":"Bill" , "lastName":"Gates" },' + '{ "firstName":"George" , "lastName":"Bush" },' + '{ "firstName":"Thomas" , "lastName":"Carter" } ]}';
var financestateMean = [{ id : 0, text : "0-未融资" }, { id : 1, text : '1-已融资' }]; meanArr = [{ field : "financestate", mean : financestateMean }];
解析
//eval() 函数可编译并执行任何 JavaScript 代码 var obj = eval ("(" + txt + ")"); //JSON 解析器只能识别 JSON 文本,而不会编译脚本 var obj = JSON.parse(txt);
使用
<p> First Name: <span id="fname"></span><br /> Last Name: <span id="lname"></span><br /> </p> <script type="text/javascript"> document.getElementById("fname").innerHTML = obj.employees[1].firstName document.getElementById("lname").innerHTML = obj.employees[1].lastName </script>
四、FastJson
a、fastjson 是阿里巴巴的开源JSON解析库,它可以解析 JSON 格式的字符串
b、支持将 Java Bean 序列化为 JSON 字符串
c、也可以从 JSON 字符串反序列化到 JavaBean。
fastjson.jar包原始下载地址:https://github.com/alibaba/fastjson
点击页面中的download即可下载最新的包
fastjson.jar包百度云盘下载地址:https://pan.baidu.com/s/1CCGoRCdSjNUDB736cRCDBw
- 继承关系
主要的3个类:JSON,JSONArray,JSONObject
a、JSON:fastJson的解析器,用于JSON格式字符串与JSON对象及javaBean之间的转换。
b、JSONObject:fastJson提供的json对象。
c、JSONArray:fastJson提供json数组对象。
- toJSONString
JAVA对象或JSON数组转JSON字符串
String s = JSONObject.toJSONString(对象/数组)
String s = JSON对象.toJSONString()
String s = JSON数组.toJSONString()
- parseObject
JSON字符串转JSON对象
JSONObject jsonObject = JSON.parseObject(字符串)
- getString
从对象中,根据key取出value
String value= jsonObject.getString("key");
- getJSONArray
从对象中,根据key取出数组
JSONArray arr= jsonObject.getJSONArray("key")
- getJSONObject
从对象中取出另一个对象
JSONObject data = jsonObject.getJSONObject("key");
从数组中取出另一个对象
for(int i=0;i<jsonArray.size();i++){
JSONObject jsonVo = (JSONObject)jsonArray.get(i);
}
- JSON->JAVA
JSON字符串转JAVA简单对象
类 对象= JSON.parseObject(字符串,类.class);
JSON对象转JAVA对象
类 对象 = JSONObject.toJavaObject(json,类.class)
- JSON->list
JSON数组字符串转list
java.util.List<类> list = JSONArray.parseArray(jsonArrayString,类.class);
String respStr = "{ 'ResultData': [ { 'businessId': '987765', 'id': '387', 'remark': '1', 'time': '20190903', 'type': '2' }, { 'businessId': '987764', 'id': '387', 'remark': '', 'time': '20190903', 'type': '1' } ], 'ResultHeader': { 'message': '调用成功!', 'type': '0' }}";
JSONObject json = JSONObject.parseObject(respStr);
String resultHeader = json.getString("ResultData");
java.util.List<SyzcdRzsqxxbVO> list = JSONArray.parseArray(resultHeader,SyzcdRzsqxxbVO.class);
- 总结
a、将字符串转换为json对象或java对象的方法都以parse开头
b、将json对象转换为java对象的方法都以to开头
五、举个栗子
demo
{ 'ResultData': [ { 'businessId': '987765', 'id': '387', 'remark': '', 'time': '20190903', 'type': '2' }, { 'businessId': '987764', 'id': '387', 'remark': '', 'time': '20190903', 'type': '1' } ], 'ResultHeader': { 'message': '调用成功!', 'type': '0' } }
public class JsonTest { @Test public void message() { String respStr = "{ 'ResultData': [ { 'businessId': '987765', 'id': '387', 'remark': '1', 'time': '20190903', 'type': '2' }, { 'businessId': '987764', 'id': '387', 'remark': '2', 'time': '20190903', 'type': '1' } ], 'ResultHeader': { 'message': '调用成功!', 'type': '0' }}"; JSONObject json = JSONObject.parseObject(respStr); JSONArray resultHeader = json.getJSONArray("ResultData"); for(int i=0;i<resultHeader.size();i++){ JSONObject jsonVo = (JSONObject)resultHeader.get(i); SyzcdRzsqxxbVO vo = JSONObject.toJavaObject(jsonVo, SyzcdRzsqxxbVO.class); vo.setMsgtype(jsonVo.getString("type")); System.out.println(vo); } } }