除了闹过腥风血雨的fastjson,你还知道哪些Java解析JSON的利器?(2)-阿里云开发者社区

开发者社区> 沉默王二> 正文

除了闹过腥风血雨的fastjson,你还知道哪些Java解析JSON的利器?(2)

简介: 除了闹过腥风血雨的fastjson,你还知道哪些Java解析JSON的利器?
+关注继续查看

03、Jackson


Jackson 是基于 Stream 构建的一款用来序列化和反序列化 JSON 的 Java 开源库,社区非常活跃,其版本的更新速度也比较快。


截止到目前,GitHub 上已经星标 5.2K 了;

Spring MVC 的默认 JSON 解析器;

与 Gson 相比,Jackson 在解析大的 JSON 文件时速度更快。

与 fastjson 相比,Jackson 更稳定。

在使用 Jackson 之前,需要先添加 Jackson 的依赖。


<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.9.1</version>
</dependency>


Jackson 的核心模块由三部分组成。


jackson-core,核心包,提供基于"流模式"解析的相关 API,它包括 JsonPaser 和 JsonGenerator。

jackson-annotations,注解包,提供标准注解功能。

jackson-databind ,数据绑定包, 提供基于"对象绑定" 解析的相关 API ( ObjectMapper ) 和"树模型" 解析的相关 API (JsonNode);基于"对象绑定" 解析的 API 和"树模型"解析的 API 依赖基于"流模式"解析的 API。

当添加 jackson-databind 之后, jackson-core 和 jackson-annotations 也随之添加到 Java 项目工程中。


这里顺带推荐一个 IDEA 插件:JsonFormat,可以将 JSON 字符串生成一个 JavaBean。怎么使用呢?可以新建一个类,然后调出 Generate 菜单。




选择 JsonFormat,输入 JSON 字符串。


{

 "age" : 18,

 "name" : "沉默王二"

}


确认后生成 JavaBean,生成的内容如下所示。


public class Cmower {
    private Integer age;
    private String name;
    public Cmower() {
    }
    public Cmower(Integer age, String name) {
        this.age = age;
        this.name = name;
    }
    public Integer getAge() {
        return age;
    }
    public void setAge(Integer age) {
        this.age = age;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
}



那怎么使用 Jackson 呢?上文已经提到,ObjectMapper 是 Jackson 最常用的 API,我们来看一个简单的示例。


Cmower wanger = new Cmower(18,"沉默王二");
System.out.println(wanger);
ObjectMapper mapper = new ObjectMapper();
String jsonString = mapper.writerWithDefaultPrettyPrinter().writeValueAsString(wanger);
System.out.println(jsonString);
Cmower deserialize = mapper.readValue(jsonString,Cmower.class);
System.out.println(deserialize);



ObjectMapper 通过 writeValue() 的系列方法可以将 Java 对象序列化为 JSON,并将 JSON 存储成不同的格式。


String(writeValueAsString)

Byte Array(writeValueAsBytes)

ObjectMapper 通过 readValue() 系列方法可以从不同的数据源(String、Bytes)将 JSON 反序列化(解析)为 Java 对象。


程序输出结果为:


com.cmower.java_demo.jackson.Cmower@214c265e

{

 "age" : 18,

 "name" : "沉默王二"

}

com.cmower.java_demo.jackson.Cmower@612fc6eb



在调用 writeValue() 或者 readValue() 方法之前,往往需要对 JSON 和 JavaBean 之间进行一些定制化配置。


1)在反序列化时忽略在 JSON 中存在但 JavaBean 不存在的字段


mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);


2)在序列化时忽略值为 null 的字段


apper.setSerializationInclusion(Include.NON_NULL);


有些时候,这些定制化的配置对 JSON 和 JavaBean 之间的转化起着重要的作用。如果需要更多配置信息,查看 DeserializationFeature、SerializationFeature 和 Include 类的 Javadoc 即可。


关于 Jackson,我们就说到这吧,以后有机会的时候再和大家细说。


04、org.json


org.json 是 JSON 官方提供的一个开源库,不过使用起来就略显繁琐了。


使用 org.json 之前,需要先在项目中引入 org.json 的依赖。


<dependency>
    <groupId>org.json</groupId>
    <artifactId>json</artifactId>
    <version>20190722</version>
</dependency>



org.json.JSONObject 类可以通过 new 关键字将 JSON 字符串解析为 Java 对象,然后 get 的系列方法获取对应的键值,代码示例如下所示。


String str = "{ \"name\": \"沉默王二\", \"age\": 18 }";

JSONObject obj = new JSONObject(str);

String name = obj.getString("name");

int age = obj.getInt("age");



调用 org.json.JSONObject 类的 getJSONArray() 方法可以返回一个表示数组的org.json.JSONArray 对象,再通过循环的方式可以获取数组中的元素,代码示例如下所示。


String str = "{ \"number\": [3, 4, 5, 6] }";

JSONObject obj = new JSONObject(str);

JSONArray arr = obj.getJSONArray("number");

for (int i = 0; i < arr.length(); i++) {

   System.out.println(arr.getInt(i));

}



如果想获取 JSON 字符串,可以使用 put() 方法将键值对放入 org.json.JSONObject 对象中,再调用 toString() 方法即可,代码示例如下所示。


JSONObject obj = new JSONObject();

obj.put("name","沉默王二");

obj.put("age",18);

System.out.println(obj.toString()); // {"name":"沉默王二","age":18}



相比较于 Gson 和 Jackson 来说,org.json 就要逊色多了,不仅不够灵活,API 也不够丰富。


05、fastjson


fastjson 是阿里巴巴开源的 JSON 解析库,它可以解析 JSON 格式的字符串,也支持将 Java Bean 序列化为 JSON 字符串。


fastjson 相对于其他 JSON 库的特点就是快,另外 API 使用起来也非常简单,更是在 2012 年被开源中国评选为最受欢迎的国产开源软件之一。


PS:尽管 fastjson 值得信赖,但也闹过不少腥风血雨,这里就不提了。


在使用 fastjson 之前,需要先添加 fastjson 的依赖。


<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>1.2.61</version>
</dependency>



那怎么使用 fastjson 呢?我们来创建一个 Java Bean,有三个字段:年龄 age,名字 name,列表 books。


class Cmower1 {
    private Integer age;
    private String name;
    private List<String> books = new ArrayList<>();
    public Cmower1(Integer age, String name) {
        this.age = age;
        this.name = name;
    }
   // getter/setter
    public void putBook(String bookname) {
        this.books.add(bookname);
    }
}


然后我们使用 JSON.toJSONString() 将 Java 对象序列化为 JSON 字符串,代码示例如下:


Cmower1 cmower = new Cmower1(18,"沉默王二");
cmower.putBook("《Web全栈开发进阶之路》");
String jsonString = JSON.toJSONString(cmower);
System.out.println(jsonString);


程序输出:


{"age":18,"books":["《Web全栈开发进阶之路》"],"name":"沉默王二"}

1

那如何解析 JSON 字符串呢?使用 JSON.parseObject() 方法,代码示例如下所示。


JSON.parseObject(jsonString, Cmower1.class)

1

06、总结


就我个人而言,我是比较推崇 Gson 的,毕竟是谷歌出品的,品质值得信赖,关键是用起来也确实比较得劲。


Jackson 呢,在解析大的 JSON 文件时速度更快,也比 fastjson 稳定。


fastjson 呢,作为我们国产开源软件中的骄傲,嗯,值得尊敬。


令我意外的是,org.json 在 StackOverflow 上一个 160 万浏览量的提问中,牢牢地占据头名答案。更令我想不到的是,老板竟然也选择了 org.json,说它比较原生,JSON 官方的亲儿子。


我。。。。。。


版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
阿里云服务器怎么设置密码?怎么停机?怎么重启服务器?
如果在创建实例时没有设置密码,或者密码丢失,您可以在控制台上重新设置实例的登录密码。本文仅描述如何在 ECS 管理控制台上修改实例登录密码。
10058 0
java json 解析
引用:http://zjny520.iteye.com/blog/943704 一json-lib.jar开发包使用依赖包 json-lib.jar开发包使用需要依赖包以下开发包: Json-lib requires (at least) the following dependencies in your classpath:     * jakarta commons-lang 2.
667 0
Java解析(读取)Json数据
以前看过书上说,XML是web service间传输信息的标准格式吧,就看了看XML。最近在做个网站,又说是有了JSON,第一回听说就看了看,总结总结一下。 1.JSON介绍   JSON比XML简单,主要体现在传输相同信息的情况下,文件的大小不同。
1513 0
阿里云服务器端口号设置
阿里云服务器初级使用者可能面临的问题之一. 使用tomcat或者其他服务器软件设置端口号后,比如 一些不是默认的, mysql的 3306, mssql的1433,有时候打不开网页, 原因是没有在ecs安全组去设置这个端口号. 解决: 点击ecs下网络和安全下的安全组 在弹出的安全组中,如果没有就新建安全组,然后点击配置规则 最后如上图点击添加...或快速创建.   have fun!  将编程看作是一门艺术,而不单单是个技术。
10882 0
SpringBoot-12-之Ajax跨域访问全解析
一.什么是跨域呢? 1.引入: 先讲个故事:从前一个叫8080的大佬和一个8081的大佬各占一方天地,还有一个叫浏览器的大佬和8080还有8081关系都不错。
1180 0
阿里云服务器如何登录?阿里云服务器的三种登录方法
购买阿里云ECS云服务器后如何登录?场景不同,阿里云优惠总结大概有三种登录方式: 登录到ECS云服务器控制台 在ECS云服务器控制台用户可以更改密码、更换系.
13871 0
+关注
沉默王二
微信搜索「沉默王二」,回复关键字「00」获取硬核计算机基础资料。
1084
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载