为公司做了小任务,需要用到Java Json库,Json库我几个月之前就用过,不过那时候是跟着项目来的,延续了项目的使用习惯直接用了jackson Json,而这次我觉得好好比较一下几个常见的Json库,然后选一个最快的。

看了几篇blog,觉得其实可选的就三种,jackson, gson, json.simple。我最初用了json.simple,然后写出来了这样的函数

从URL中读取Json数据,并且在Request中添加身份信息

    public static JSONObject readJsonFromUrl(String url, String token) {
try {
URLConnection conn = new URL(url).openConnection();
conn.setRequestProperty("Authorization", "Bearer " + token);
InputStream response = conn.getInputStream(); String JsonStr = IOUtils.toString(response);
JSONObject jsonObj = (JSONObject)JSONValue.parseWithException(JsonStr);
// System.out.println(jsonObj);
return jsonObj; }catch (Exception e) {
e.printStackTrace();
}
return null;
}

然后,抽取Json中的数据

    public static Reply parseJson(JSONObject jsonObj) {
Reply reply = new Reply(jsonObj.get("next_stream_position").toString()); JSONArray jsonAry = (JSONArray)(jsonObj.get("entries")); for(int i = 0; i < jsonAry.size(); i ++) {
JSONObject iObj = (JSONObject)jsonAry.get(i);
reply.addIPAddr(iObj.get("ip_address").toString());
}
return reply;
}

写完之后,我觉得有必要将Json替换成更加高效的实现,于是我打算从Jackson, Gson中挑一种使用

Jackson适合处理大量的数据,Gson适合处理小些的数据,并且Gson的jar包比其他选择小了很多,给我一种很轻巧的感觉。

此外,我很不情愿为Json数据写一个POJO,因为我只要这个POJO中的一两个成员变量。Jackson不仅要这个POJO,还需要在这个POJO上加上annotation,所以我直接把它排除了。

Gson,google的产品,给我一种可以信赖的感觉。于是我写出了这样的代码

    public static Reply readJsonFromUrl(String url, String token) {
Reply reply = new Reply();
try {
URLConnection conn = new URL(url).openConnection();
conn.setRequestProperty("Authorization", "Bearer " + token);
InputStream response = conn.getInputStream();
JsonReader reader = new JsonReader(new InputStreamReader(response, "UTF-8")); // only one element will be returned
// parse data recursively
// google's way to handle streaming data, ugly though
reader.beginObject();
reader.beginObject();
while(reader.hasNext()) {
String name = reader.nextName();
if(name.equals("next_stream_position"))
reply.stream_position = reader.nextString();
else if(name.equals("entries")) {
reader.beginArray();
while(reader.hasNext()) {
reader.beginObject();
while(reader.hasNext()) {
name = reader.nextName();
if(name.equals("ip_address"))
reply.addIPAddr(reader.nextString());
else if(name.equals("created_at"))
reply.lastDate = reader.nextString();
else
reader.skipValue();
}
reader.endObject(); }
reader.endArray();
} else
reader.skipValue();
}
reader.endObject();
reader.close();
return reply;
}catch (Exception e) {
e.printStackTrace();
}
return null;
}

由于需要处理流式数据且不愿意写POJO,最终就写成了上面这一坨丑陋不堪的代码,我想这下效率倒是可以保证了。

写完代码后我想了下,觉得最合适的Json库应该还是Json.simple,它的转换简单,可以直接根据String get到想要的那一个信息,且最重要的是代码写的短,实现的效率高。在企业,在学校,在面临交差的任何地方,用最短的时间完成任务才是最重要的,这一点我已深有体会。

Well,以后默认用Json.simple

Jackson Gson Json.simple 比较的更多相关文章

  1. Jackson Gson Json.simple part 2

    这篇blog介绍 Jackson 的特点和使用方法 Jackson支持三种使用方法 流API(streaming api Incremental parsing/generation) JsonPar ...

  2. JSON库之性能比较:JSON.simple VS GSON VS Jackson VS JSONP

    从http://www.open-open.com/lib/view/open1434377191317.html 转载 Java中哪个JSON库的解析速度是最快的? JSON已经成为当前服务器与WE ...

  3. 开源 JSON 库解析性能对比( Jackson / Json.simple / Gson )

    Json 已成为当前服务器与 web 应用之间数据传输的公认标准. 微服务及分布式架构经常会使用 Json 来传输此类文件,因为这已经是 webAPI 的事实标准. 不过正如许多我们习以为常的事情一样 ...

  4. Json学习总结(2)——Java 下的 JSON库性能比较:JSON.simple vs. GSON vs. Jackson vs. JSONP

    JSON已经成为当前服务器与WEB应用之间数据传输的公认标准,不过正如许多我们所习以为常的事情一样,你会觉得这是理所当然的便不再深入思考了.我们很少会去想用到的这些JSON库到底有什么不同,但事实上它 ...

  5. Java 下的 JSON库性能比较:JSON.simple

    JSON已经成为当前服务器与WEB应用之间数据传输的公认标准,不过正如许多我们所习以为常的事情一样,你会觉得这是理所当然的便不再深入思考了.我们很少会去想用到的这些JSON库到底有什么不同,但事实上它 ...

  6. json解析jackson ,Gson,等知识总结

    相关资料链接: Java构造和解析json数据的两种方法详解 java解析json Android网络之数据分析---使用Google Gson 解析Json数据 使用jackson在java中处理j ...

  7. Java下利用Jackson进行JSON解析和序列化

    Java下利用Jackson进行JSON解析和序列化   Java下常见的Json类库有Gson.JSON-lib和Jackson等,Jackson相对来说比较高效,在项目中主要使用Jackson进行 ...

  8. 【转载】Java下利用Jackson进行JSON解析和序列化

    参考资料: https://blog.csdn.net/sdut406/article/details/85647982 Java下常见的Json类库有Gson.JSON-lib和Jackson等,J ...

  9. Java下用Jackson进行JSON序列化和反序列化(转)

    Java下常见的Json类库有Gson.JSON-lib和Jackson等,Jackson相对来说比较高效,在项目中主要使用Jackson进行JSON和Java对象转换,下面给出一些Jackson的J ...

随机推荐

  1. STM32的TAMPER-RTC管脚作为Tamper的使用[转]

    问题一: 当 TAMPER引脚上的信号从 0变成1或者从 1变成 0(取决于备份控制寄存器BKP_CR的 TPAL位),会产生一个侵入检测事件.侵入检测事件将所有数据备份寄存器内容清除.   然而为了 ...

  2. MapReduce 图解流程超详细解答(1)-【map阶段】

    转自:http://www.open-open.com/lib/view/open1453097241308.html 在MapReduce中,一个YARN  应用被称作一个job, MapReduc ...

  3. OSPF中 hello报文的 内容

    邻居关系通过hello报文来建立.Hello报文中包含如下一些内容: 1.始发路由器的router-id 2.始发路由器接口的area-id 3.始发路由器接口的地址掩码 4.始发路由器接口的auth ...

  4. 使用 pv 命令监控 linux 命令的执行进度

    如果你是一个 linux 系统管理员,那么毫无疑问你必须花费大量的工作时间在命令行上:安装和卸载软件,监视系统状态,复制.移动.删除文件,查错,等等.很多时候都是你输入一个命令,然后等待很长时间直到执 ...

  5. 转换基于Maven的Java项目支持Eclipse IDE

    在过去的教程中,使用 Maven 创建了一个Java项目,但是这个项目不能导入到Eclipse IDE中,因为它不是 Eclipse 风格的项目. 这里有一个指南,向您演示如何转换 Maven 生成 ...

  6. Maven存储库

    什么是Maven资源库? 在 Maven 术语里存储库是一个目录,即目录中保存所有项目的 jar 库,插件或任何其他项目特定文件,并可以容易由 Maven 使用. Maven库中有三种类型 local ...

  7. php -- php模拟浏览器访问网址

    目前我所了解到的在php后台中,用php模拟浏览器访问网址的方法有两种: 第一种:模拟GET请求:file_get_contents($url) 通过php内置的 file_get_contents ...

  8. CURL 常用参数

    在Linux中curl是一个利用URL规则在命令行下工作的文件传输工具,可以说是一款很强大的http命令行工具. 1.查看响应头信息: -I :显示http response的头信息. [root@l ...

  9. C# 校验Email(电子邮件)地址是否合法

    用于校验给定的Email地址是否合法,只针对用于提供的Email地址的格式,不对其是否真实存在进行校验. /// <summary> /// 验证EMail是否合法 /// </su ...

  10. C# Bitmap/png转成jpg格式,压缩图片

    public static ImageCodecInfo GetEncoder(ImageFormat format) { ImageCodecInfo[] codecs = ImageCodecIn ...