Java处理JSON数据有三个比较流行的类库FastJSON、Gson和Jackson。
对于结构复杂的对象,推荐有Gson
在简单的对象,处理json效率最高的框架
Jackson框架是基于Java平台的一套数据处理工具
现在比较流行的是FastJSON和Gson
返回JSON时的方法返回值都是Object
1.使用阿里巴巴的fastjson来实现json数据解析
fastjson的github地址:https://github.com/alibaba/fastjson
fastjson的文档地址: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/gson
gson官方文档:https://github.com/google/gson/blob/master/UserGuide.md
使用的话需要在pom.xml中引入依赖
版本日期: (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更多的用法可以参考官方文档或者相关的博客。