好久没有写博客了,最近的笔记都整理到印象笔记了,等有时间了再移到CSDN吧。
今天写一下FastJSON。
FastJSON处理大的JSON对象或数组时,单纯用JSONObject、JSONArray的API不利于性能。
比如反序列化Map对象对应的JSON String。
JSONObject responseJSONObject;
try {
responseJSONObject = JSON.parseObject(new String(response, "UTF-8"));
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
return;
}
for (Object object : responseJSONObject.entrySet()) {
Map.Entry<String, JSONObject> objectMapEntry = (Map.Entry<String, JSONObject>) object;
map.put(objectMapEntry.getKey(), JSON.parseObject(objectMapEntry.getValue().toJSONString(), Map的Value对应的类.class));
}
这种方式不够快。
来个快的,在工作中的场景快了三分之二:
private <T> Map<String, T> getNormalMap(Class<T> clazz, byte[] response){
Map<String, T> map = new HashMap<>();
JSONReader reader;
try {
reader = new JSONReader(new StringReader(new String(response, "UTF-8")));
reader.startObject();
while(reader.hasNext()) {
map.put(reader.readString(), reader.readObject(clazz));
}
reader.endObject();
reader.close();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return map;
}
private <T> Map<String, List<T>> getListMap(byte[] response) {
Map<String, List<T>> map = new HashMap<>();
JSONReader reader;
try {
reader = new JSONReader(new StringReader(new String(response, "UTF-8")));
reader.startObject();
while(reader.hasNext()) {
map.put(reader.readString(), reader.readObject(List.class));
}
reader.endObject();
reader.close();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return map;
}
这里注意一下,如果JSON里有对象是同一个,序列化时会"$ref": "$.属性名或者属性名.属性名或者属性名.属性名[索引],看你的JSON对象了",第二种方式不能解析出来。当然,JSON里一般对象不放同一个。
更多的优化:https://springboot.io/t/topic/926,里面是一些示例,可以自己写成泛型方法,用来当普用工具。