测试Java中json字符串转map的效率,
1,使用的json字符串:
40个键值对:50个键值对 = 1:1 = 66986 x 2 = 133972个json,
每个json的key字符串长度=8,且key随机取自于一个800长度的字符串数组,
这个字符串数组中的每个字符串,也是随机生成的,从[a-z,A-Z,0-9]里面随机取8个字符为一个字符串,生成800个到这个数组。
这个json字符串就是一层的,没有再多层的。
2,测试代码
/**
* 测试json字符串转map的效率,
* 40个键值对:50个键值对 = 1:1 = 66986 x 2 = 133972个json
*/
private static void testJson(Scanner scanner) {
List<String> jsonField = getJsonField(scanner);
testJson2Map(jsonField);
}
/**
* 测试json字符串转map的效率
*/
private static void testJson2Map(List<String> json) {
int times = 10;
fastJson(json, times);
//fastJson2(json, times);
gson(json, times);
//gson2(json, times);
jackson(json, times);
}
/**
* jsonField使用如下方式转json
*/
private static void fastJson(List<String> json, int times) {
long a = System.currentTimeMillis();
while (times > 0) {
json.forEach(s -> JSON.parseObject(s).get("xxuEeTg5"));
times--;
}
System.out.println("fastJson 执行耗时 : " + (System.currentTimeMillis() - a) / 1000f + " 秒 ");
}
/**
* 确认过数据之后,json是只有一层的
*/
private static void fastJson2(List<String> json, int times) {
long a = System.currentTimeMillis();
while (times > 0) {
json.forEach(s -> JSON.toJavaObject(JSONObject.parseObject(s), Map.class).get("xxuEeTg5"));
times--;
}
System.out.println("fastJson2 执行耗时 : " + (System.currentTimeMillis() - a) / 1000f + " 秒 ");
}
private static void jackson(List<String> json, int times) {
long a = System.currentTimeMillis();
while (times > 0) {
json.forEach(s->{
ObjectMapper mapper = new ObjectMapper();
try {
Map map = mapper.readValue(s, Map.class);
map.get("xxuEeTg5");
} catch (IOException e) {
e.printStackTrace();
}
});
times--;
}
System.out.println("执行耗时 : " + (System.currentTimeMillis() - a) / 1000f + " 秒 ");
}
private static void gson(List<String> json, int times) {
long a = System.currentTimeMillis();
while (times > 0) {
json.forEach(s -> {
Gson gson = new Gson();
Map maps = gson.fromJson(s, new TypeToken<Map>() {
}.getType());
maps.get("xxuEeTg5");
});
times--;
}
System.out.println("gson 执行耗时 : " + (System.currentTimeMillis() - a) / 1000f + " 秒 ");
}
private static void gson2(List<String> json, int times) {
long a = System.currentTimeMillis();
while (times > 0) {
json.forEach(s -> {
Gson gson = new Gson();
Map maps = gson.fromJson(s, Map.class);
maps.get("xxuEeTg5");
});
times--;
}
System.out.println("gson2 执行耗时 : " + (System.currentTimeMillis() - a) / 1000f + " 秒 ");
}
测试结果:
测试处理130w的json字符串转Java的map。
发现,果然如传说的那样,fastjson就是快。
使用的fastjson的版本是1.2.56,差不多最新的了
我代码里面带2的方法,是同一个jar可能有不同的实现方式,想看看这个不同实现方式是否会影响效率,测试完之后,发现这个变化对结果的影响几乎没有。
但是,这个json转map还是慢呀。。。。
fastjson-常见的问题--官方回复--github网址,中文的。
我这个需求是要处理大量的json字符串,不是说全部合并成一个超大的字符串,是n多个小的字符串,要把这b多的碎片的(每个100个k v 的json)json字符串,转成map处理。
注意,我这个测试的使用常见。