JSON
JavaScript Object Notation,JS对象简谱,是一种轻量级的数据交换格式
一、如何表示一本书
一本书:
书名
简介
java:
class Book{
private String name;
private String info;
get/set...
}
Book b = new Book();
b.setName(“金苹果”);
b.setInfo(“种苹果”);
...
js:
var b = new Object();
b.name = "金苹果";
b.info = "种苹果";
XML:
<book>
<name>金苹果</name>
<info>种苹果</info>
</book>
JSON:
{
"name":"金苹果",
"info":"种苹果"
}
json比xml 更小、更快,更易解析
二、对象格式与数组格式
2.1对象格式
{
"name":"金苹果",
"info":"种苹果"
}
2.2 数组格式
{
"name":"伟杰老师",
"age":18,
"pengyou":["张三","李四","王二","麻子",{
"name":"野马老师",
"info":"像匹野马一样狂奔在技术钻研的道路上"
}],
"heihei":{
"name":"大长刀",
"length":"40m"
}
}
三、JSON特点
3.1 特征
- JSON 是纯文本
- JSON 具有"自我描述性"(人类可读)
- JSON 具有层级结构(值中存在值)
- JSON 可通过 JavaScript 进行解析
- JSON 数据可使用 AJAX 进行传输
3.2 与XML不同点
- 没有结束标签
- 更短
- 读写的速度更快
- 能够使用内建的 JavaScript eval() 方法进行解析
- 使用数组
- 不使用保留字
四、JSON语法
-
语法规则,JSON 语法是 JavaScript 对象表示语法的子集。
- 数据在名称/值对中
- 数据由逗号分隔
- 大括号
{}
保存对象 - 中括号
[]
保存数组,数组可以包含多个对象
-
JSON 名称/值对
key : value
-
JSON 值
-
数字(整数或浮点数)
{ "age":30 }
-
字符串(在双引号中)
-
逻辑值(true 或 false)
{ "flag":true }
-
数组(在中括号中)
[{ key1 : value1-1 , key2:value1-2 }, { key1 : value2-1 , key2:value2-2 }]
-
对象(在大括号中)
{key1 : value1, key2 : value2, ... keyN : valueN }
-
null
{ "runoob":null }
-
五、JSON使用
5.1 Gson
Gson因应Google公司研发。主要有toJson与fromJson两个转换函数。Gson完全可以将复杂类型的json到bean或bean到json的转换。
使用:
-
序列化 / 反序列化
Gson gson = new Gson(); //序列化 String json = gson.toJson(object); //反序列化 Object object = gson.fromJson(json, Object.class);
-
嵌套对象序列化 / 反序列化
//对象也为嵌套关系可以直接进行
-
Array
String myJson = "['ASD131','DFS131','TER131']"; Gson gson = new Gson(); //序列化 String myJson = gson.toJson(myJson); //反序列化 String[] myArray = gson.fromJson(myJson, String[].class);
-
List,List反序列化时必须提供Type
String myJson = ""; Gson gson = new Gson(); //序列化 Type objectListType = new TypeToken<ArrayList<Object>>(){}.getType(); //反序列化 List<Object> myList = gson.fromJson(myJson, objectListType);
-
Map和Set同理
-
序列化和反序列化的时候忽略某些变量使用
@Expose
注解标志类中的属性GsonBuilder gsonBuilder = new GsonBuilder(); gsonBuilder.excludeFieldsWithoutExposeAnnotation(); Gson gson = builder.create();
5.2 FastJson
Fastjson是一个Java语言编写的高性能的JSON处理器,由阿里巴巴公司开发。FastJson在复杂类型的转换上会出现一些问题,可能会出现引用的类型,导致Json转换出错,需要制定引用。FastJson采用的算法,使得parse解析的速度更快。
- JSONArray : 相当于List
- JSONObject: 相当于Map<String,Object>
使用:
-
序列化 / 反序列化
//序列化 String objJson = JSON.toJSONString(Object object); //反序列化 Object object = JSON.parseObject(objJson, Object.class);
-
Map转JSON
Map<String, Object> map = new HashMap<String, Object>(); map.put("key1", "One"); map.put("key2", "Two"); //序列化 String mapJson = JSON.toJSONString(map); //反序列化 Map<String, Object> map1 = JSON.parseObject(mapJson, new TypeReference<Map<String, Object>>(){});
-
List
List<Map<String, Object>> list = new ArrayList<Map<String, Object>>(); Map<String, Object> map1 = new HashMap<String, Object>(); map1.put("key1", "One"); map1.put("key2", "Two"); Map<String, Object> map2 = new HashMap<String, Object>(); map2.put("key1", "Three"); map2.put("key2", "Four"); list.add(map1); list.add(map2); //序列化 String listJson = JSON.toJSONString(list); //反序列化 List<Map> list1 = JSON.parseArray(listJson, Map.class);
5.3 Jackson
相比json-lib框架,Jackson所依赖的jar包较少,简单易用并且性能也要相对高些。而且Jackson社区相对比较活跃,更新速度也比较快。Jackson对于复杂类型的json转换bean会出现问题,一些集合Map,List的转换出现问题。Jackson对于复杂类型的bean转换Json,转换的json格式不是标准的Json格式。
用法:
-
系列化和反序列化
ObjectMapper MAPPER = new ObjectMapper(); //反序列化 //T类型对象,beanType: Class<T> T t = MAPPER.readValue(jsonData, beanType); //序列化 String jsonString = MAPPER.writeValueAsString(object);
-
List 转化
//序列化 String jsonData = MAPPER.writeValueAsString(object); //反序列化 Class<T> beanType; JavaType javaType = MAPPER.getTypeFactory().constructParametricType(List.class, beanType); List<T> list= MAPPER.readValue(jsonData, javaType);
-
Map序列化 / 反序列化
//序列化 String jsonString = MAPPER.writeValueAsString(map); //反序列化 LinkedHashMap<?, ?> map= new LinkedHashMap<>(); map = MAPPER.readValue(jsonData,LinkedHashMap.class);
-
常用注解
- @JsonIgnoreProperties:此注解是类注解,作用是json序列化时将java bean中的一些属性忽略掉,序列化和反序列化都受影响。
- @JsonIgnore:此注解用于属性或者方法上(最好是属性上),作用和上面的@JsonIgnoreProperties一样。
- @JsonFormat:此注解用于属性或者方法上(最好是属性上),可以方便的把Date类型直接转化为我们想要的模式,比如@JsonFormat(pattern = “yyyy-MM-dd HH-mm-ss”)
- @JsonSerialize:此注解用于属性或者getter方法上或者类上,用于在序列化时嵌入我们自定义的代码,比如序列化一个double时在其后面限制两位小数点。
- @JsonDeserialize:此注解用于属性或者setter方法上或者类上,用于在反序列化时可以嵌入我们自定义的代码,类似于上面的@JsonSerialize。
5.4 Json-lib
json-lib最开始的也是应用最广泛的json解析工具,json-lib 不好的地方确实是依赖于很多第三方包,包括commons-beanutils.jar,commons-collections-3.2.jar,commons-lang-2.6.jar,commons-logging-1.1.1.jar,ezmorph-1.0.6.jar,对于复杂类型的转换,json-lib对于json转换成bean还有缺陷。
但是JDK8以后,json-lib已经很少被选择使用,性能也不高,了解即可
方法:
-
JSONSerializer可以任何java对象转换为JSON, 这样就能够方法JSONObject和JSONArray使用了
//序列化 JSON json = JSONSerializer.toJSON(book); //反序列化 Object tempObj = JSONSerializer.toJava(json);
-
JSON对象
//序列化 JSONObject jsonObject = JSONObject.fromObject(object); //反序列化 Object object = (Object)JSONObject.toBean(jsonObject,Object.class);
-
JSONArray数组
//将一个List对象转化为JSONArray JSONArray jsonList = JSONArray.fromObject(list);