JavaScript Object Notation,JS对象简谱,是一种轻量级的数据交换格式
json比xml 更小、更快,更易解析
语法规则,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 }
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();Fastjson是一个Java语言编写的高性能的JSON处理器,由阿里巴巴公司开发。FastJson在复杂类型的转换上会出现一些问题,可能会出现引用的类型,导致Json转换出错,需要制定引用。FastJson采用的算法,使得parse解析的速度更快。
JSONArray : 相当于ListJSONObject: 相当于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转JSON
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);相比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。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);