轉載http://blog.csdn.net/hongwangzhang/article/details/51260879
在日志解析,前后端數據傳輸交互中,經常會遇到 String 與 map、json、xml 等格式相互轉換與解析的場景,其中 json 基本成為了跨語言、跨前后端的事實上的標准數據交互格式。應該來說各個語言中 解析 json 的庫都一大片(具體 json 格式與三方庫的介紹請見: http://www.json.org/json-zh.html ),比如 Python 都集成在了內置庫中,成為標准 API,今天我們要聊的是 Java 中如何方便的使用 json 格式。
從上面的鏈接介紹中我們可以看到,java 的三方 json 庫是最多的,可謂百花齊放百家爭鳴的節奏。。。但是,某些庫存在鏈式依賴的問題,使用的時候要注意,如果你沒用 maven 管你你的依賴,用起來會很痛苦,比如 json-lib、smart-json 等。下面我要推薦的是阿里巴巴工程師開源的一個 json 庫:FastJSON,這個庫在解析速度和易用性上來說都很不錯。
1、了解fastjson
1.1 Fastjson介紹
Fastjson是一個Java語言編寫的JSON處理器。
1、遵循 http://json.org 標准,為其官方網站收錄的參考實現之一。
2、功能qiang打,支持JDK的各種類型,包括基本的JavaBean、Collection、Map、Date、Enum、泛型。
3、無依賴,不需要例外額外的jar,能夠直接跑在JDK上。
4、開源,使用Apache License 2.0協議開源。
1.2 如果獲得Fastjson?
https://github.com/alibaba/fastjson
2、主要的使 用入口
Fastjson API入口類是com.alibaba.fastjson.JSON,常用的序列化操作都可以在JSON類上的靜態方法直接完成。
public static final Object parse(String text); // 把JSON文本parse為JSONObject或者JSONArray public static final JSONObject parseObject(String text); // 把JSON文本parse成JSONObject public static final <T> T parseObject(String text, Class<T> clazz); // 把JSON文本parse為JavaBean public static final JSONArray parseArray(String text); // 把JSON文本parse成JSONArray public static final <T> List<T> parseArray(String text, Class<T> clazz); //把JSON文本parse成JavaBean集合 public static final String toJSONString(Object object); // 將JavaBean序列化為JSON文本 public static final String toJSONString(Object object, boolean prettyFormat); // 將JavaBean序列化為帶格式的JSON文本 public static final Object toJSON(Object javaObject); 將JavaBean轉換為JSONObject或者JSONArray。
3、有關類庫的一些說明
SerializeWriter:相當於StringBuffer
JSONArray:相當於List<Object>
JSONObject:相當於Map<String, Object>
JSON反序列化沒有真正數組,本質類型都是List<Object>
4、fastjson還有很多很高級的特性
比如支持注解、支持全類型序列化,這些都是很好的特性,功能強大,不在本次測試范圍。
5、測試代碼
package lavasoft.stu.json;
import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.serializer.SerializeConfig; import com.alibaba.fastjson.serializer.SimpleDateFormatSerializer; import java.util.*; /** * Created by IntelliJ IDEA. * * @author leizhimin 11-11-22 上午9:15 */ public class Foo { private String vString = "vStringhehhehe"; private char vchar = 'x'; private byte vbyte = 64; private short vshort = 128; private int vint = 65535; private long vlong = 9999999L; private float vfloat = 12.1f; private double vdouble = 22.203d; private boolean vboolean = false; // private Date vdate = new Date(); private Date dddd = new Date(); private Date vDate = new Date(); private Date v_Date = new Date(); private Object vnull = null; private String[] avString = {"aaa", "bbb", "ccc"}; private int[] avint = {1, 2, 3, 4}; private boolean[] avboolean = {true, false, true, true}; private List<String> listString = new ArrayList<String>(); private Map<String, String> map = new HashMap<String, String>(); private Bar bar = new Bar(); private Bar[] avBar = {new Bar(), new Bar()}; private List<Bar> listBar = new ArrayList<Bar>(); { listString.add("listString1"); listString.add("listString2"); listString.add("listString3"); map.put("x", "s11111x"); map.put("y", "s22222y"); map.put("z", "s33333z"); listBar.add(new Bar()); listBar.add(new Bar()); listBar.add(new Bar()); } public String getvString() { return vString; } public void setvString(String vString) { this.vString = vString; } public char getVchar() { return vchar; } public void setVchar(char vchar) { this.vchar = vchar; } public byte getVbyte() { return vbyte; } public void setVbyte(byte vbyte) { this.vbyte = vbyte; } public short getVshort() { return vshort; } public void setVshort(short vshort) { this.vshort = vshort; } public int getVint() { return vint; } public void setVint(int vint) { this.vint = vint; } public long getVlong() { return vlong; } public void setVlong(long vlong) { this.vlong = vlong; } public float getVfloat() { return vfloat; } public void setVfloat(float vfloat) { this.vfloat = vfloat; } public double getVdouble() { return vdouble; } public void setVdouble(double vdouble) { this.vdouble = vdouble; } public boolean isVboolean() {