JSON
一、什么是JSON?
二、XML与Json的的转换:
三、json的规则
html 请求数据三种方式
四、JSON的序列化
1.java的json序列化
2.java的json反序列化
3.JavaScript的json序列化
4.JavaScript的json反序列化
案例1:java的json序列化和反序列化
案例二:JavaScript的json序列化和反序列化
JSON
一、什么是JSON?
中午肚子饿了,到餐厅点餐。向服务员点了几个菜,厨师根据用户的需求,开始烹饪食物,食物烹饪好后,怎么将食物呈现给用户呢?这时就需要用到盛放食物的碗了用户拿到盛放食物的碗,就可以获得点的餐了这个碗就充当了数据交换的容器了。
JSON(JavaScript Object Notation)一种简单的数据格式,比xml更轻巧。JSON是JavaScript原生格式,这意味着在JavaScript中处理JSON数据不需要任何特殊的API或工具包。
二、XML与Json的的转换:
1.常规转换
<emp>
<name>fxhl</name>
<city>深圳</city>
<age>23</age>
</emp>
转换为的Json的为:
{“name”:“fxhl”,“city”:“深圳”,“age”:23}
三、json的规则
JSON的规则很简单:对象是一个无序的“‘名称/值’对”集合。一个对象以“{”(左括号)开始,“}”(右括号)结束。每个“名称”后跟一个“:”(冒号);“‘名称/值’对”之间使用“,”(逗号)分隔。JSON的表现形式一般就三种(对象,数组,字符串)
规则如下:
1)映射用冒号(“:”)表示。名称:值
2)并列的数据之间用逗号(“,”)分隔。名称1:值1,名称2:值2
3) 映射的集合(对象)用大括号(“{}”)表示。{名称1:值1,名称2:值2}
4) 并列数据的集合(数组)用方括号(“[]”)表示。
1.对象:
var o1={
"returnCode": "R0000",
"returnMsg": "成功",
"lessTimes": "2",
}
2.数组:
[
{属性1:值,属性2:值2},
{属性1:值,属性2:值2}
]
var o2={
"employees": [
{ "firstName":"John" , "lastName":"Doe" },
{ "firstName":"Anna" , "lastName":"Smith" }
]
}
3.数组对象混合:
var o3={
"icon": [
{
"title": "尚天猫,就购了",
"innerText": "天猫宝贝",
"url": "//www.tmall.com/"
},
{
"title": "保险理赔",
"position": "99",
"innerText": "分组-保险理赔",
"iconPopupComplex":
{
"popup_title": "保险理赔",
"subIcons": [
{
"dom_class": "icon-service-yunfeixian",
"icon_content": "卖家赠送退货运费险"
}
]
}
}
]
}
html 请求数据三种方式
query string
form data
payload
四、JSON的序列化
JSON支持text/plain和application/json两种类型格式
1.java的json序列化
fastjson阿里巴巴、jackson spring默认的 、jsonlib、gson……
ObjectMapper
writerXxxx
writeValueAsString()
2.java的json反序列化
ObjectMapper类
- List item
- readValue() 单一对象的反序列化
ObjectMapper mapper=new ObjectMapper();
mapper.readValue(req.getInputStream(), User.class);
TypeFactory 集合对象的反序列化
- constructXxxxx
- constructCollectionType(List.class, User.class)
ObjectMapper mapper=new ObjectMapper();
JavaType valueType=mapper.getTypeFactory().constructCollectionType(List.class, User.class);
List<User> beans=mapper.readValue(req.getInputStream(), valueType);
3.JavaScript的json序列化
JSON.stringify() 将对象序列化为JSON字符串
默认情况下JSON.stringify()输出的JSON字符串不包含任何空格字符或缩进;此外,值为未定义的任何属性也都会被跳过,结果都是有效的JSON数据类型。
JSON.stringify()的参数
实际上,JSON.stringify()除了要序列化的javascript对象之外,还可以接收两个参数(用于指定以不同方式序列化的JavaScript):1第一个参数是过滤器(可为数组或函数))2。第二个参数是一个选项(表示是否在JSON字符串中保留缩进)
如果过滤器的参数是数组,那么JSON.stringify()的结果将只包含数组中列出的属性。
var x={
"name":"张三",
"parents":["李四","王五"],
edit:3,
year:2019
}//注意:第二个数组中的两个字段要与JSON中的属性对应。
var jsionText=JSON.stringify(x,["name","edit"])
jsonText:
"{"name":"张三","edit":3}"
如果第二个参数是函数(传入的函数接收两个属性,属性(键)名和属性值):
var jsonText=JSON.stringify(x,function(key,value){
switch(key){
case "parents":
return value.join(",");//中间加一个“,”
case "year":
return 666;
case "edit":
return undefined
default:
return value;
}
})
jsonText:
"{"name":"张三","parents":"李四,王五","year":666}".
可以看到如果键为”name”,通过返回未定义删除该属性。一定要提供默认项,使其他值可以显示在结果中
-----------------------------------------------------------
字符串的缩进
JSON.stringify()方法的第三个参数用于控制结果的缩进和空白符。如果这个参数是一个树枝那么他表示的是每个级别的缩进空格。
例:要每个级别缩进4个空格
var jsonText = JSON.stringify(x,null,4)
注:最大缩进空格为10,所有大于10的值都会被自动转换为10。
有时候JSON.stringify()不能满足自动序列化的需求。这时就可以给对象定义的toJSON()方法。
toJSON()方法可以作为函数过滤器的补充假设把一个对象传入JSON.stringify(),序列化该对象的顺序:
(1)如果存在的toJSON()方法且能通过它取得有效的值,则调用该方法,否则返回JSON本身。
(2)如果提供了第二个参数,应用这个过滤器,传入过滤器的值是第(1)步返回的值(其实结果就是,上述的jsonText输出结果是toJSON()方法返回的值&#