在 Java 中操作 JSON

JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,它易于阅读和编写,并且与语言无关。在Java中,有多个库可以用来解析和生成JSON,每个库都有其独特的特点和用法。

JSON
JSON 取值可以是 object、array、number、string、boolean (true/false) 或null,此外 JSON 值可以是另一个 JSON,也就是支持嵌套。

org.json

JSON-Java库 也称为 org.json(不要与 Google 的org.json.simple混淆)为我们提供了用于在 Java 中解析和操作 JSON 的类。

该库还可以在 JSON、XML、HTTP headers、Cookies、逗号分隔列表或文本等之间进行转换。

添加依赖

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

最新版本可以查看MVN中央仓库

org.json 关键类

  • JSONObject – 类似于 Java 原生的Map类对象,它存储无序的键值对
  • JSONArray – 类似于 Java 原生 Vector 实现的有序值序列
  • JSONTokener – 一种将一段文本分解为一系列标记的工具, JSONObject或JSONArray可以使用这些来解析 JSON 字符串
  • CDL – 一种工具,提供将逗号分隔文本转换为JSONArray 的方法
  • Cookie – 从 JSON字符串转换为 cookie
  • HTTP – 用于从 JSON字符串转换为 HTTP header
  • JSONException – 该库抛出的标准异常

基本用法

org.json 的 JSONObject 非常像 Java 的 Map 接口:

JSONObject jo = new JSONObject();
jo.put("name", "Zhangsan");
jo.put("age", "26");
jo.put("city", "Shanghai");

得到的JSON 字符串:

{"city":"Shanghai","name":"Zhangsan","age":"26"}

Jackson

Jackson是Java的高性能JSON处理器,其开发人员称赞该库具有快速、正确、轻量级等优势。

添加依赖

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

最新版本可以查看MVN中央仓库

基本用法

    public static void main(String[] args) throws IOException {
        Student student = new Student();
        student.setName("张三");
        student.setAge(26);
        student.setScore(89.5);

        ObjectMapper mapper = new ObjectMapper();
        mapper.writeValue(System.out, student);

        Student value = mapper.readValue("{\"name\":\"张三\",\"age\":26,\"score\":89.5}", Student.class);
    }

FastJson

FastJson是一个轻量级 Java 库,用于高效地将 JSON 字符串转换为 Java 对象。

添加依赖

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

最新版本可以查看MVN中央仓库

基本用法

首先定义一个 Java 实体类 Student.java

@Data

代码中的 @Data 注解来源于 lombok,它可以简化代码中的 setter/getter 和 toString() 方法。

@Data
public class Student{

    /**
     * 姓名
     */
    private String name;

    /**
     * 年龄
     */
    private Integer age;

    /**
     * 成绩
     */
    private Double score;
}

使用 JSON.toJSONString() 将 Java 对象转换为 JSON 字符串:

import com.alibaba.fastjson.JSON;

    public static void main(String[] args) {
        Student student = new Student();
        student.setName("张三");
        student.setAge(26);
        student.setScore(89.5);

        String string = JSON.toJSONString(student);
        System.out.println(string);
    }

得到的 JSON 格式数据:

{"age":26,"name":"张三","score":89.5}

Gson

添加依赖

<dependency>
    <groupId>com.google.code.gson</groupId>
    <artifactId>gson</artifactId>
    <version>2.10.1</version>
</dependency>

最新版本可以查看MVN中央仓库

基本用法

json-io

json-io 也是一个无其他外部依赖的 JSON 格式处理库,其本身仅 185KB,加上它自身引用的内部 java-util,也才 250KB。并且支持从 JDk1.8 到 JDK 21 的众多版本。

添加依赖

<dependency>
    <groupId>com.cedarsoftware</groupId>
    <artifactId>json-io</artifactId>
    <version>4.19.13</version>
</dependency>

基本用法

    public static void main(String[] args){
        Student student = new Student();
        student.setName("张三");
        student.setAge(26);
        student.setScore(89.5);

        String jsonStr = JsonIo.toJson(student,writeOptions);
        Student result = JsonIo.toObjects(jsonStr,readOptions,Student.class);
    }
  • JsonIo.toJson 序列化 Object 为 JSON.
  • JsonIo.toObjects 反序列化 JSON 为 Java Object.

Genson

Genson 是一个强大的 JSON 解析库,它提供的功能非常多,遗憾的是已经多年没有更新了。

添加依赖

<dependency>
    <groupId>com.owlike</groupId>
    <artifactId>genson</artifactId>
    <version>1.6</version>
</dependency>

当前最新版 1.6 是 2019 年发布的。

基本用法

    public static void main(String[] args){
        Student student = new Student();
        student.setName("张三");
        student.setAge(26);
        student.setScore(89.5);

        Genson genson = new Genson();
        String jsonStr = genson.serialize(student);
        Student result = JsonIo.deserialize(jsonStr,Student.class);
    }

使用起来非常方便。

JSON-P

JSON-P 是一个用于解析、构建、转换和查询 JSON 消息的 Java API。 Java Specification Request (JSR) 353提出了该API。 JSR 353 旨在开发一个 Java API 来处理 JSON。不过,大多数流行的库,如 Jackson、Gson 等,并不直接实现该规范。

添加依赖

<dependency>
    <groupId>jakarta.json</groupId>
    <artifactId>jakarta.json-api</artifactId>
    <version>2.1.1</version>
</dependency>

<dependency>
    <groupId>org.glassfish</groupId>
    <artifactId>jakarta.json</artifactId>
    <version>2.0.1</version>
    <classifier>module<classifier> 
</dependency>

基本用法

    public static void main(String[] args){
        Student student = new Student();
        student.setName("张三");
        student.setAge(26);
        student.setScore(89.5);
        JsonObject json = Json.createObjectBuilder()
          .add("age", foo.getAge())
          .add("name", student.getName())
          .build();
        String result = json.toString();

        JsonParser parser = Json.createParser(new StringReader(result));
        while (parser.hasNext()) {
            Event event = parser.next();
            switch (event) {
                case VALUE_STRING:
                    String value = parser.getString();
                    assertEquals(foo.getName(), value);
                    break;
            }
        }
        parser.close();
    }
  • Json.createObjectBuilder()用于将对象转换为 JSON。
  • Json.createParser()用于解析 JSON 。
  • JSON-P API 最初设计是为了其他三方库在此基础上扩展实现的,直接使用会复杂些。

总结

org.json

  • 特点:提供了JSONObject和JSONArray等类来表示JSON对象和数组。
  • 用法:类似于Java的Map和List,用于创建和操作JSON数据。

Jackson

  • 特点:高性能、功能丰富的JSON处理器。
  • 用法:提供了注解和类型转换器来映射Java对象和JSON数据。

FastJson

  • 特点:阿里巴巴开源的快速、高效的JSON处理库。
  • 用法:简单易用,通过JSON.toJSONString和JSON.parseObject进行序列化和反序列化。

Gson

  • 特点:Google开发的简单易用的JSON库。
  • 用法:自动将Java对象转换为JSON字符串,或将JSON字符串转换为Java对象。

json-io

  • 特点:无其他外部依赖的轻量级JSON处理库。
  • 用法:提供了JsonIo.toJson和JsonIo.toObjects方法进行序列化和反序列化。

Genson

  • 特点:功能强大的JSON解析库,但更新不频繁。
  • 用法:提供了灵活的配置和扩展性。

JSON-P

  • 特点:Java官方提供的JSON处理API,由JSR 353定义。
  • 用法:使用JsonObject和JsonArray等类来操作JSON数据。

在Java中处理JSON数据时,开发者可以根据项目需求和个人偏好选择合适的库。org.json提供了基本的JSON操作功能,适合简单的需求。Jackson和FastJson因其高性能和易用性而广受欢迎。Gson以其简单性和Google的支持而受到开发者的喜爱。json-io和Genson提供了轻量级和高度可配置的解决方案。JSON-P作为官方API,虽然功能强大,但可能不如其他库那样流行和易于上手。开发者应根据项目的具体需求,如性能、易用性、社区支持和库的维护情况,来选择最合适的JSON处理库。

转载请注明出处:码谱记录 » 在 Java 中操作 JSON
标签:

相关推荐