赞
踩
一、概述
Fastjson 是阿里巴巴开源的一个 Java 工具库,它常常被用来完成 Java 的对象与 JSON 格式的字符串的相互转化。
Fastjson 可以操作任何 Java 对象,即使是一些预先存在的没有源码的对象。
二、源码分析
1.首先以fastjson-1.2.70为例,用IDEA打开看下项目结构,如下:
2.涉及Java 的对象与 JSON 格式的字符串的相互转化,首先的分析JSON这个抽象类。
(1)这个类有很多的方法,如下图:
上述只是部分方法。
JSON类实现了2个接口,JSONStreamAware 、JSONAware。
JSONStreamAware :
其中writeJSONString方法 中的参数 Appendable 也是一个接口,也就是可以附加字符序列和值的对象,这个接口的作用是提供一个输出JSON字符串的方法,以便于其他的方法调用。
public interface JSONStreamAware {
void writeJSONString(Appendable var1) throws IOException;
}
实现类:
public void writeJSONString(Appendable appendable) {
SerializeWriter out = new SerializeWriter();
try {
(new JSONSerializer(out)).write(this);
appendable.append(out.toString());
} catch (IOException var7) {
throw new JSONException(var7.getMessage(), var7);
} finally {
out.close();
}
}
JSONAware:
这个接口只需要实现该接口的类实现toJSONString 的方法。
package com.alibaba.fastjson;
public interface JSONAware {
String toJSONString();
}
具体实现:
public String toJSONString() {
SerializeWriter out = new SerializeWriter();
String var2;
try {
(new JSONSerializer(out)).write(this);
var2 = out.toString();
} finally {
out.close();
}
return var2;
}
(2)JSON类中的方法。
JSON类重载大概有四类方法,分别为:
这个类中的四类方法是调用各个包中的方法。
这里主要说明我们经常使用的转换,parseObject 和 toJSONString,分别为转换为对象和JSON字符串。
第一个方法toJSONString,这个将java对象转换为JSON字符串:
String jsonStr = JSON.toJSONString(obj);
第一个方法parseObject ,这个将JSON字符串转换为java对象:
MyObject vo = JSON.parseObject(jsonStr, MyObject.class);
如果是返回对象是泛型,则可以这样转化。
import com.alibaba.fastjson.TypeReference;
List<MyObject> list = JSON.parseObject(jsonStr, new TypeReference<List<MyObject>>() {});
通过源码可以知道,JSONObject和JSONArray继承JSON。
JSONObject:
public class JSONObject extends JSON implements Map<String, Object>, Cloneable, Serializable, InvocationHandler { private static final long serialVersionUID = 1L; private static final int DEFAULT_INITIAL_CAPACITY = 16; private final Map<String, Object> map; public JSONObject() { this(16, false); } public JSONObject(Map<String, Object> map) { if (map == null) { throw new IllegalArgumentException("map is null."); } else { this.map = map; } }
通过该类的继承与实现关系,可以发现,JSONObject实现了Map接口,而json对象中的数据都是以"键值对"形式出现,可以猜想, JSONObject底层操作是由Map实现的。
JSONArray:
public class JSONArray extends JSON implements List<Object>, Cloneable, RandomAccess, Serializable { private static final long serialVersionUID = 1L; private final List<Object> list; protected transient Object relatedArray; protected transient Type componentType; public JSONArray() { this.list = new ArrayList(); } public JSONArray(List<Object> list) { if (list == null) { throw new IllegalArgumentException("list is null."); } else { this.list = list; } }
根据JSONArray的继承与实现,并结合上面对JSONObject的分析,可以发现,其内部是由List接口中的方法来完成操作的。
接着来看下JSON中的toJSONString()方法,它实现json对象转化为json字符串和java对象转化为json 字符串。
public static String toJSONString(Object object) { return toJSONString(object, emptyFilters); } public static String toJSONString(Object object, SerializerFeature... features) { return toJSONString(object, DEFAULT_GENERATE_FEATURE, features); } public static String toJSONString(Object object, int defaultFeatures, SerializerFeature... features) { SerializeWriter out = new SerializeWriter((Writer)null, defaultFeatures, features); String var5; try { JSONSerializer serializer = new JSONSerializer(out); serializer.write(object); var5 = out.toString(); } finally { out.close(); } return var5; }
该方法经过多次重载,但最终都是实现json对象转化为json字符串和java对象转化为json 字符串。
再来看下JSON类中的parseObject()方法,实现json字符串转换为json对象或javabean对象。
public static JSONObject parseObject(String text, Feature... features) { return (JSONObject)parse(text, features); } public static JSONObject parseObject(String text) { Object obj = parse(text); if (obj instanceof JSONObject) { return (JSONObject)obj; } else { try { return (JSONObject)toJSON(obj); } catch (RuntimeException var3) { throw new JSONException("can not cast to JSONObject.", var3); } } }
该方法返回JSONObject对象,用于实现json字符串向json对象的转化,其内部调用了parse()方法,调用底层的DefaultJSONParser解析类进行转化,在转化失败时,抛出异常。
最后就是JSON类中的JSONArray()方法,实现json字符串转化为json对象数组或List。
public static JSONArray parseArray(String text) { if (text == null) { return null; } else { DefaultJSONParser parser = new DefaultJSONParser(text, ParserConfig.getGlobalInstance()); JSONLexer lexer = parser.lexer; JSONArray array; if (lexer.token() == 8) { lexer.nextToken(); array = null; } else if (lexer.token() == 20) { array = null; } else { array = new JSONArray(); parser.parseArray(array); parser.handleResovleTask(array); } parser.close(); return array; } }
这个与parseObject()方法类似。
(3)我们可以通过main方法测试下:
public static void main(String[] args) { Map<String,Object> map = new HashMap<>(); map.put("name","张三"); map.put("age",20); System.out.println("----javaBean to jsonString-------"); String str1= JSON.toJSONString(map); System.out.println("str1:"+str1); System.out.println("-----jsonString to javaBean------"); //Map map1=JSON.parseObject(str1,new TypeReference<Map>(){}); Map map1=JSON.parseObject(str1,Map.class); System.out.println(map1); System.out.println("map1:"+map1); List<Map<String,Object>> list = new ArrayList<>(); list.add(map); System.out.println("-----jsonString to jsonArray-----"); List<Map> list1=JSON.parseArray(JSON.toJSONString(list),Map.class); System.out.println("list1:"+list1); }
打印结果如下:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。