json-lib
json-lib最开始的也是应用最广泛的json解析工具,json-lib 不好的地方确实是依赖于很多第三方包,在Json.org网站上,Java可以使用的解析Json的组件就有21种之多。这里以使用org.json解析JSON为例。在读本文之前,读者有必要了解一下JSON的结构,这里不作介绍。
首先下载org.json源码,下载地址:https://github.com/douglascrockford/JSON-java,点Downloads,Windows系统就选zip吧。当然你也可以用Git,只是我不太习惯那玩意。下载完后解压,在你的项目里新建一个名为org.json的包,把除README和Test.java以外的所有文件放入该包内(Eclipse只要拖进去就可以),现在我们就可以用org.json解析JSON.为了以后方便,你也可以把org.json这个包打成jar,在要用的项目上导入就行。
String s = "{\"person\":{\"name\":\"张三\",\"age\":20}}";
JSONObject jsonObj = new JSONObject(s);
JSONObject result = jsonObj.getJSONObject("person");
System.out.println("姓名:"+result.getString("name")+" 年龄:"+result.getInt("age"));
s="{\"persons\":[\"张三\",\"李四\",\"王五\"]}";
jsonObj = new JSONObject(s);JSONArray;
jsonarr=jsonObj.getJSONArray("persons");
for(int i=0;i<jsonarr.length();i++)
{
System.out.println(jsonarr.getString(i));
}
* 开源的Jackson *
相比json-lib框架,Jackson所依赖的jar包较少,简单易用并且性能也要相对高些。
而且Jackson社区相对比较活跃,更新速度也比较快。
Jackson对于复杂类型的json转换bean会出现问题,一些集合Map,List的转换出现问题。
Jackson对于复杂类型的bean转换Json,转换的json格式不是标准的Json格式
使用Jackson,Java对象与json的相互转换
package com.fts.interface1.json;
import java.util.List;
/**
* json数组类
* @author fts
* @version 创建时间:2017年6月24日 下午2:33:41
*/
public class ListObject{
private List<?> items;
public List<?> getItems() {
return items;
}
public void setItems(List<?> items) {
this.items = items;
}
}
package com.fts.interface1.json;
public class SingleObject{
private Object object;
public Object getObject() {
return object;
}
public void setObject(Object object) {
this.object = object;
}
}
package com.fts.interface1.json;
import com.fasterxml.jackson.databind.ObjectMapper;
/**
* JackJsonUtils生成json数据和解析json数据
* @author fts
* @version 创建时间:2017年6月24日 上午10:34:46
*/
public class JackJsonUtils {
static ObjectMapper objectMapper;
/*
* 解析json
* <T>类型设置成泛型
* content表示要解析的json的内容
* Class<T> valueType 要解析成的类
*
*/
public static <T> T fromJson(String content, Class<T> valueType) {
if (objectMapper == null) {
objectMapper = new ObjectMapper();
}
try {
return objectMapper.readValue(content, valueType);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
/*
* java对象生成json
*/
public static String toJson(Object object) {
if (objectMapper == null) {
objectMapper = new ObjectMapper();
}
try {
return objectMapper.writeValueAsString(object);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}
package com.fts.interface1.servlet;
import java.io.IOException;
import java.sql.SQLException;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.fts.interface1.dao.StudentDemo;
import com.fts.interface1.json.JackJsonUtils;
import com.fts.interface1.json.ListObject;
import com.fts.interface1.model.Student;
/**
* 实现接口
* @author fts
* @version 创建时间:2017年6月24日 下午2:32:08
*/
public class StudentServlet extends HttpServlet{
StudentDemo ss=new StudentDemo();
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
try {
//从数据库获取的学生信息
List<Student> list =ss.querryStudents();
ListObject listObject=new ListObject();
listObject.setItems(list);
String responseText=JackJsonUtils.toJson(listObject);
resp.getWriter().write(responseText);
System.out.println(responseText);
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
Google的Gson
Gson是谷歌公司研发的。应用主要为toJson与fromJson两个转换函数,无依赖,不需要例外额外的jar,能够直接跑在JDK上。
而在使用这种对象转换之前需先创建好对象的类型以及其成员才能成功的将JSON字符串成功转换成相对应的对象。
类里面只要有get和set方法,Gson完全可以将复杂类型的json到bean或bean到json的转换,是JSON解析的神器。
Gson在功能上面无可挑剔,但是性能上面比FastJson有所差距。
阿里的Fastjson
Fastjson是一个Java语言编写的高性能的JSON处理器,由阿里巴巴公司开发。
无依赖,不需要例外额外的jar,能够直接跑在JDK上。
FastJson在复杂类型的Bean转换Json上会出现一些问题,可能会出现引用的类型,导致Json转换出错,需要制定引用。
FastJson采用独创的算法,将parse的速度提升到极致,超过所有json库。