java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > org.json和JSON-B解析JSON

如何在Java中使用org.json和JSON-B解析与编写JSON

作者:面朝大海,春不暖,花不开

JSON-Java是用于在Java中读取和写入JSON文档的参考应用程序,这篇文章主要介绍了如何在Java中使用org.json和JSON-B解析与编写JSON的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下

前言

JSON(JavaScript Object Notation)因其轻量、语言无关且易于读写的特性,已成为现代 Web 应用中数据交换的标准格式。在 Java 中,处理 JSON 的库众多,其中 org.json 和 JSON-B 是两种流行的选择。本文将深入探讨这两种库的特点、使用示例、优缺点以及适用场景,帮助开发者根据项目需求选择合适的工具。

1. JSON 在 Java 中的重要性

JSON 是一种基于文本的数据格式,源自 JavaScript 编程语言(ECMA-262 第 3 版)。它支持两种主要结构:

JSON 的简单性和跨语言兼容性使其成为 API 数据传输和配置文件存储的理想选择。在 Java 中,处理 JSON 需要专门的库来解析 JSON 字符串并将其转换为 Java 对象,或将 Java 对象序列化为 JSON 字符串。本文将重点介绍 org.json 和 JSON-B 两种库。

2. org.json 概述

org.json(也称为 JSON-Java)是一个轻量级的 Java 库,广泛用于 JSON 数据的解析和生成。它在 Android 开发中尤为流行,因为它是 Android 平台的默认 JSON 库。该库提供核心类如 JSONObject 和 JSONArray,用于处理 JSON 对象和数组。

2.1 org.json 的特点

2.2 使用示例

以下是使用 org.json 解析和编写 JSON 的示例代码。

解析 JSON

以下代码展示如何从 JSON 文件中读取数据并提取特定字段:

public class SoftwareParseOrgJson {
    final static String FILE_NAME = "/json/softwareinfo.json";

    public static void main(String[] args) throws Exception {
        InputStream jsonInput = SoftwareParseOrgJson.class.getResourceAsStream(FILE_NAME);
        if (jsonInput == null) {
            throw new NullPointerException("can't find" + FILE_NAME);
        }
        JSONObject obj = new JSONObject(new JSONTokener(jsonInput));
        System.out.println("Software Name: " + obj.getString("name"));
        System.out.println("Version: " + obj.getString("version"));
        System.out.println("Description: " + obj.getString("description"));
        System.out.println("Class: " + obj.getString("className"));
        JSONArray contribs = obj.getJSONArray("contributors");
        for (int i = 0; i < contribs.length(); i++) {
            System.out.println("Contributor Name: " + contribs.get(i));
        }
    }
}

输出

Software Name: robinparse
Version: 1.2.3
Description: Another Parser for JSON
Class: RobinParse
Contributor Name: Robin Smythe
Contributor Name: Jon Jenz
Contributor Name: Jan Ardann

此代码通过 JSONTokener 从输入流创建 JSONObject,然后使用 getString 和 getJSONArray 方法提取字段。注意,JSONArray 不支持 Iterable,因此需要使用传统 for 循环遍历。

编写 JSON

以下代码展示如何创建 JSON 对象并将其转换为字符串:

.ConcurrentHashMap

public class WriteOrgJson {
    public static void main(String[] args) {
        JSONObject jsonObject = new JSONObject();
        jsonObject.put("Name", "robinParse")
                  .put("Version", "1.2.3")
                  .put("Class", "RobinParse");
        String printable = jsonObject.toString();
        System.out.println(printable);
    }
}

输出

{"Name":"robinParse","Class":"RobinParse","Version":"1.2.3"}

此代码利用 JSONObject 的流式 API(支持方法链式调用)添加键值对,并通过 toString 方法生成格式化的 JSON 字符串。

2.3 org.json 的优缺点

优点缺点
API 简单,易于快速上手功能较少,缺乏高级映射支持
无外部依赖,轻量级不如 Jackson 等库强大
广泛用于 Android 开发定制化能力有限

3. JSON-B 概述

JSON-B(JSON Binding)是 Java API for JSON Binding(JSR-367),是 Jakarta EE 平台的一部分。它旨在通过自动映射简化 Java 对象与 JSON 数据之间的转换。JSON-B 的参考实现是 Yasson,它还被纳入 Eclipse MicroProfile 项目。

3.1 JSON-B 的特点

3.2 使用示例

以下是使用 JSON-B 读取和编写 JSON 的示例代码。

读取和编写 JSON

以下代码展示如何将 JSON 字符串转换为 Java 对象并反向序列化:

public class ReadWriteJsonB {
    public static void main(String[] args) throws IOException {
        Jsonb jsonb = JsonbBuilder.create();
        // 读取
        String jsonInput = "{\"id\":0,\"firstName\":\"Robin\",\"lastName\":\"Williams\"}";
        Person rw = jsonb.fromJson(jsonInput, Person.class);
        System.out.println(rw);
        // 编写
        String result = jsonb.toJson(rw);
        System.out.println(result);
    }
}

输出(假设 Person 类有适当的 toString 方法):

Person{id=0, firstName=Robin, lastName=Williams}
{"firstName":"Robin","id":0,"lastName":"Williams"}

此代码通过 JsonbBuilder 创建 Jsonb 实例,使用 fromJson 将 JSON 字符串转换为 Person 对象,再通过 toJson 将对象转换回 JSON 字符串。默认情况下,Person 类无需注解即可工作。

定制化示例

JSON-B 支持通过注解定制映射。例如,排除冗余字段:

public class Person {
    private int id;
    private String firstName;
    private String lastName;

    @JsonbTransient
    public String getFullName() {
        return firstName + " " + lastName;
    }
    //  getter 和 setter...
}

运行上述代码后,输出将不包含 fullName 字段:

{"firstName":"Robin","id":0,"lastName":"Williams"}

通过 @JsonbTransient 注解,getFullName 方法的返回值被排除在 JSON 输出之外,从而减少数据冗余。

3.3 JSON-B 的优缺点

优点缺点
标准 API,跨平台一致性需要 Jakarta EE 环境
自动映射,开发效率高对于简单任务可能过于复杂
支持高级定制化依赖外部库

4. org.json 与 JSON-B 的比较

以下是对 org.json 和 JSON-B 的详细比较:

特性org.jsonJSON-B
标准化非标准,但广泛使用标准 API(JSR-367)
易用性适合简单操作自动映射,开发更高效
定制化有限通过注解支持广泛定制
性能适合中小型数据优化用于大型数据集
依赖无需外部依赖需要 Jakarta EE 或类似环境
适用场景通用 JSON 解析/编写Java 对象与 JSON 绑定

5. 适用场景

6. 结论

org.json 和 JSON-B 都是 Java 中处理 JSON 的强大工具,各自适用于不同场景。org.json 因其简单性和无依赖特性,适合轻量级项目和 Android 开发;而 JSON-B 作为标准 API,提供自动映射和高级定制功能,适合企业级应用。开发者应根据项目需求(如环境、复杂性和标准化要求)选择合适的库。

通过理解这两种库的优缺点,您可以为您的 Java 项目选择最佳的 JSON 处理方案。

关键引用

到此这篇关于如何在Java中使用org.json和JSON-B解析与编写JSON的文章就介绍到这了,更多相关org.json和JSON-B解析JSON内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文