Java處理JSON資料有三個比較流行的類庫FastJSON、Gson和Jackson。
對于結構複雜的對象,推薦有Gson
在簡單的對象,處理json效率最高的架構
Jackson架構是基于Java平台的一套資料處理工具
現在比較流行的是FastJSON和Gson
傳回JSON時的方法傳回值都是Object
1.使用阿裡巴巴的fastjson來實作json資料解析
fastjson的github位址:
https://github.com/alibaba/fastjsonfastjson的文檔位址:
https://github.com/alibaba/fastjson/wiki/%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98使用的話需要在pom.xml中引入依賴
版本日期:(Jul 02, 2017)
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.34</version>
</dependency>
例如:在java對象轉化為json對象中
fastjson
//建立一個JSONObject的對象
JSONObject jsonObject=new JSONObject();
//toJSON()傳回的是Object類型,需要你強制轉換一下
jsonObject=(JSONObject) JSON.toJSON(object);
//在JSON資料傳回給前端
return jsonObject;
2.使用google的Gson來實作json資料解析
gson的github位址:
https://github.com/google/gsongson官方文檔:
https://github.com/google/gson/blob/master/UserGuide.md版本日期: (May 31, 2017)
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.8.1</version>
</dependency>
也是java對象轉化為json對象
//建立一個JSONObject
Gson gson=new Gson();
//toJSON()傳回的是String類型
Object result=gson.toJson(object);
//在JSON資料傳回給前端
return result;
不過一般使用gson的話都會自己寫一個工具類
一般叫
GsonUtils
public class GsonUtils {
static Gson gson;
/**
* 自定義TypeAdapter ,null對象将被解析成空字元串
*/
private static final TypeAdapter<String> STRING = new TypeAdapter<String>() {
public String read(JsonReader reader) {
try {
if (reader.peek() == JsonToken.NULL) {
reader.nextNull();
return "";//原先是傳回Null,這裡改為傳回空字元串
}
return reader.nextString();
} catch (Exception e) {
e.printStackTrace();
}
return "";
}
public void write(JsonWriter writer, String value) {
try {
if (value == null) {
writer.nullValue();
return;
}
writer.value(value);
} catch (Exception e) {
e.printStackTrace();
}
}
};
/**
* 自定義adapter,解決由于資料類型為Int,實際傳過來的值為Float,導緻解析出錯的問題
* 目前的解決方案為将所有Int類型當成Double解析,再強制轉換為Int
*/
private static final TypeAdapter<Number> INTEGER = new TypeAdapter<Number>() {
@Override
public Number read(JsonReader in) throws IOException {
if (in.peek() == JsonToken.NULL) {
in.nextNull();
return 0;
}
try {
double i = in.nextDouble();
return (int) i;
} catch (NumberFormatException e) {
throw new JsonSyntaxException(e);
}
}
@Override
public void write(JsonWriter out, Number value) throws IOException {
out.value(value);
}
};
static {
GsonBuilder gsonBulder = new GsonBuilder();
gsonBulder.registerTypeAdapter(String.class, STRING); //所有String類型null替換為字元串“”
gsonBulder.registerTypeAdapter(int.class, INTEGER); //int類型對float做相容
//通過反射擷取instanceCreators屬性
try {
Class builder = (Class) gsonBulder.getClass();
Field f = builder.getDeclaredField("instanceCreators");
f.setAccessible(true);
Map<Type, InstanceCreator<?>> val = (Map<Type, InstanceCreator<?>>) f.get(gsonBulder);//得到此屬性的值
//注冊數組的處理器
gsonBulder.registerTypeAdapterFactory(new CollectionTypeAdapterFactory(new ConstructorConstructor(val)));
} catch (Exception e) {
e.printStackTrace();
}
gson = gsonBulder.create();
}
/**
* Json字元串 轉為指定對象
*
* @param json json字元串
* @param type 對象類型
* @param <T> 對象類型
* @return
* @throws JsonSyntaxException
*/
public <T> T toBean(String json, Class<T> type) throws JsonSyntaxException {
T obj = gson.fromJson(json, type);
return obj;
}
/**
* 将jsonStr轉換為javaBean
*
* @param object
* @return json string
*/
public String toJson(Object object) {
return gson.toJson(object);
}
/**
* 将jsonStr轉換為javaBean
*
* @param json
* @param type
* @return instance of type
*/
public <V> V fromJson(String json, Class<V> type) {
return gson.fromJson(json, type);
}
/**
* 将jsonStr轉換為javaBean
*
* @param json
* @param type
* @return instance of type
*/
public <V> V fromJson(String json, Type type) {
return gson.fromJson(json, type);
}
/**
* 将reader轉換為javaBean
*
* @param reader
* @param type
* @return instance of type
*/
public <V> V fromJson(Reader reader, Class<V> type) {
return gson.fromJson(reader, type);
}
/**
* 将reader轉換為javaBean
*
* @param reader
* @param type
* @return instance of type
*/
public <V> V fromJson(Reader reader, Type type) {
return gson.fromJson(reader, type);
}
public <V> V jsonRequest2Bean(final InputStream input, Class<V> clazz) throws IOException{
String json = IOUtils.toString(input, "UTF-8");
return toBean(json,clazz);
}
}
這樣使用的話就是
跟上面一樣,把java對象轉化成json對象
其實差不多
Object result = new GsonUtils().toJson(responseObj);
return result;
fastjson和gson更多的用法可以參考官方文檔或者相關的部落格。