json解析库 fastjson gson jackson

2016-01-10 21:56:00
admin
原创 2466
摘要:json解析库 fastjson gson jackson

一、json介绍

1、JSON,JavaScript Object Notation,一种轻量的数据交互格式;

2、JSON支持集合和数组两种数据类型;

3、官方文档https://www.json.org


object,集合
{}
{ members }
members
pair
pair , members
pair
string : value

array,数组
[]
[ elements ]
elements
value 
value , elements
value
string
number
object
array
true
false
null


二、json解析库对比

1、fastjson,阿里巴巴开源json解析库,漏洞太多,不推荐使用;

2、gson,谷歌开源json解析库,目前引用量最大,推荐使用;

3、jackson,Spring内置json解析库,目前引用量超过fastjson;


三、fastjson代码示例

1、解析可能抛异常需要捕获,因为底层是map,所以元素不允许重复;

2、如果需要元素按插入顺序排序,需要在初始化时指定;

3、null和空字符串解析不会抛异常,会返回null对象;


import com.alibaba.fastjson.*;
import com.alibaba.fastjson.serializer.*;

public class JSONTest {
public static void main(String[] args) {

String content = "{}";
JSONObject obj = JSON.parseObject(content);
System.out.println(obj); //{}

obj = JSON.parseObject("{\"name\":\"feinen\"}");
System.out.println(obj.get("name"));
System.out.println(obj.get("unknown")); //返回null
System.out.println(obj.getString("unknown")); //返回null
System.out.println(obj.getIntValue("unknown")); //返回0
System.out.println(obj.toString()); //输出{"name":"feinen"}

obj = new JSONObject(true); 
obj.put("name", "xiangfeineng");
obj.put("age", null);
obj.put("friends", new JSONArray());
SerializerFeature[] features = { SerializerFeature.WriteMapNullValue };
String msg = JSON.toJSONString(obj, features);
System.out.println(msg); //输出{"name":"xiangfeineng","age":null,"friends":[]}
}
}


四、fastjson自定义序列化

浮点数序列化:JSONFilter.java


import com.alibaba.fastjson.*;
import com.alibaba.fastjson.serializer.*;


public class JSONFilter {
public static class MyValueFilter implements ValueFilter {
public Object process(Object object, String name, Object value) {
if (value != null && value instanceof Double) {
String str = value.toString();
if (str.endsWith(".0"))
str = str.substring(0, str.length() - 2);
else if (str.endsWith(".00"))
str = str.substring(0, str.length() - 3);
return str;
}
return value;
}
}


public static void main(String[] args) {
JSONObject json = new JSONObject(true);
json.put("double", 1.0);
System.out.println(JSON.toJSONString(json));
System.out.println(JSON.toJSONString(json, new MyValueFilter()));
System.out.println(json.get("double").getClass().getName());
}
}


输出:

{"double":1}
{"double":"1"}
java.lang.Double


五、gson使用详解

1、JsonElement包含4个子类:JsonObject、JsonArray、JsonPrimitive、JsonNull;

2、每种JsonElement都包含特定方法,使用isXX方法判断元素类型,使用getAs方法转换元素具体类型;

3、只有JsonPrimitive可以获取元素内容,getAsString和getAsInt都可以调用;

4、gson默认维护元素插入顺序;

5、JsonParser用于解析字符串到对象,解析null抛出异常,解析空字符串返回null;

6、Gson类解析字符串到POJO对象,或者将POJO对象转换成字符串,解析null和空字符串不会抛异常,会返回null;

7、Gson类解析字符串到POJO对象是利用反射机制,字符串不包含任何POJO属性时,返回的POJO对象属性值都是null;

8、时间序列化调用GsonBuilder的setDateFormat("yyyy-MM-dd HH:mm:ss"),或者使用类型适配器,后者优先级更高;

9、transient申明的字段不序列化,excludeFieldsWithoutExposeAnnotation表示使用@Expose注解的字段才会序列化;

10、@SerializedName用于指定序列化字段名;

11、setPrettyPrinting序列化格式更好看,serializeNulls序列化空对象,disableHtmlEscaping取消网页字符转义;

12、JsonElement.toString等价于new GsonBuilder().serializeNulls().disableHtmlEscaping().create().toJson;


使用类型适配器进行时间序列化:

import java.lang.reflect.*;
import com.google.gson.*;
import java.util.*;
import java.text.*;

public class DateSerializer implements JsonSerializer<Date> {
private static SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
public JsonElement serialize(Date src, Type typeOfSrc, JsonSerializationContext context) {
return new JsonPrimitive(df.format(src));
}
}


import java.lang.reflect.*;
import com.google.gson.*;
import java.util.*;
import java.text.*;

public class DateDeserializer implements JsonDeserializer<Date> {
private static SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
public Date deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
try {
return df.parse(json.getAsString());
} catch (Exception e) {
throw new JsonParseException(e);
}
}
}


GsonBuilder设置类型适配器:

registerTypeAdapter(Date.class, new DateSerializer())

registerTypeAdapter(Date.class, new DateDeserializer())

发表评论
评论通过审核之后才会显示。