1:感觉见鬼了一般存储JSONObject中的字段竟然不见了?
???????JSONObject object=new JSONObject(); ???????Map fields = new HashMap(); ???????fields.put("1","1"); ???????object.put("fields",fields); ???????System.out.println(object.toString()); ???????JSONObject newFields = object.getJSONObject("fields"); ???????newFields.put("2",2); ???????//TODO ?序列化字符串没有2?!! ???????// 看源码便可以知晓,当我们使用Map当做JSONObject解析时候,Fastjson会返回一个新的对象 ???????System.out.println(object.toString());
com.alibaba.fastjson.JSON#toJSON(java.lang.Object, com.alibaba.fastjson.serializer.SerializeConfig)源码:
public static Object toJSON(Object javaObject, SerializeConfig config) { ???????if (javaObject == null) { ???????????return null; ???????} ???????if (javaObject instanceof JSON) { ???????????return javaObject; ???????} ???????if (javaObject instanceof Map) { ???????????Map<Object, Object> map = (Map<Object, Object>) javaObject; // 创建了一个新的JSONObject返回了 ???????????JSONObject json = new JSONObject(map.size()); ???????????for (Map.Entry<Object, Object> entry : map.entrySet()) { ???????????????Object key = entry.getKey(); ???????????????String jsonKey = TypeUtils.castToString(key); ???????????????Object jsonValue = toJSON(entry.getValue()); ???????????????json.put(jsonKey, jsonValue); ???????????} ???????????return json; ???????}
2:当我们使用JSONArray时候,有些时候里面可能存储较大量的数据,但是有些场景需要在指定index处进行insert操作,这时由于JSONArray默认底层使用的是ArrayList存储,因此存在性能问题,那么是否可以使用LinkedList呢?答案可以的:
JSONArray arr = new JSONArray(new LinkedList());
3:当我们查询接口获取到一个JSONArray字符串想反序列化时候可否将底层存储的ArrayList使用LinkedList替换呢?答案:可以,修改一下源码或者添加一个重载方法即可。
public static JSONArray parseArray(String text) { ???????if (text == null) { ???????????return null; ???????} ???????DefaultJSONParser parser = new DefaultJSONParser(text, ParserConfig.getGlobalInstance()); ???????JSONArray array; ???????JSONLexer lexer = parser.lexer; ???????if (lexer.token() == JSONToken.NULL) { ???????????lexer.nextToken(); ???????????array = null; ???????} else if (lexer.token() == JSONToken.EOF) { ???????????array = null; ???????} else {// ???????????array = new JSONArray(new ArrayList()); ???????????array = new JSONArray(new LinkedList()); ???????????parser.parseArray(array); ???????????parser.handleResovleTask(array); ???????} ???????parser.close(); ???????return array; ???}
FastJson遇见的问题或项目实战中优化的问题,看源码都可以解决
原文地址:https://www.cnblogs.com/leodaxin/p/8854951.html