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

 更新时间:2025年06月10日 10:13:46   作者:面朝大海,春不暖,花不开  
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 的特点

  • 简单 API:易于上手,适合基本的 JSON 操作。
  • 解析功能:支持从字符串、输入流或读取器解析 JSON。
  • 序列化:允许从 Java 数据创建 JSON 对象和数组。
  • 格式转换:支持 JSON 与 XML、HTTP 头、Cookie 等格式的转换。
  • 无依赖:无需外部库,适合轻量级项目。

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 的特点

  • 标准 API:确保跨实现的可移植性。
  • 自动映射:无需手动解析,支持 Java 对象与 JSON 的双向转换。
  • 定制化:通过注解支持灵活的映射配置。
  • 企业级支持:集成于 Jakarta EE,适合复杂应用。
  • 易用性:方法命名直观,减少开发工作量。

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. 适用场景

  • 使用 org.json 的场景

    • 需要轻量级、无依赖的 JSON 处理库。
    • 在 Android 项目中进行简单 JSON 操作。
    • 项目对高级功能需求较低。
  • 使用 JSON-B 的场景

    • 在 Jakarta EE 或 MicroProfile 环境中开发企业级应用。
    • 需要标准化的 JSON 绑定 API。
    • 项目要求复杂的对象映射和定制化。

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内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java对接阿里云短信服务保姆级教程(新手秒会)

    Java对接阿里云短信服务保姆级教程(新手秒会)

    这篇文章主要介绍了如何在阿里云上申请短信服务以及如何使用Java代码进行对接,包括申请资质、签名和模板,以及编写Java代码整合成工具类进行调用的步骤,需要的朋友可以参考下
    2024-12-12
  • SpringBoot Redis实现接口幂等性校验方法详细讲解

    SpringBoot Redis实现接口幂等性校验方法详细讲解

    这篇文章主要介绍了SpringBoot Redis实现接口幂等性校验方法,近期一个老项目出现了接口幂等性校验问题,前端加了按钮置灰,依然被人拉着接口参数一顿输出,还是重复调用了接口,通过复制粘贴,完成了后端接口幂等性调用校验
    2022-11-11
  • SpringBoot使用Log4j过程详解

    SpringBoot使用Log4j过程详解

    这篇文章主要介绍了SpringBoot使用Log4j过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-02-02
  • SpringBoot程序打包失败(.jar中没有主清单属性)

    SpringBoot程序打包失败(.jar中没有主清单属性)

    在学习SpringBoot,打包SpringBoot程序后,在cmd运行出现了 某某某.jar中没有注清单属性,本文就来介绍一下原因以及解决方法,感兴趣的可以了解一下
    2023-06-06
  • 面试题:Java 实现查找旋转数组的最小数字

    面试题:Java 实现查找旋转数组的最小数字

    这篇文章主要介绍了Java 实现查找旋转数组的最小数字,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-07-07
  • Java多线程之synchronized关键字的使用

    Java多线程之synchronized关键字的使用

    这篇文章主要介绍了Java多线程之synchronized关键字的使用,文中有非常详细的代码示例,对正在学习java的小伙伴们有非常好的帮助,需要的朋友可以参考下
    2021-04-04
  • springboot validator枚举值校验功能实现

    springboot validator枚举值校验功能实现

    这篇文章主要介绍了springboot validator枚举值校验功能实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-01-01
  • 浅析idea 添加项目依赖的两种方式

    浅析idea 添加项目依赖的两种方式

    这篇文章主要介绍了idea 添加项目依赖的两种方式,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-12-12
  • MybatisPlus之时间处理问题

    MybatisPlus之时间处理问题

    在数据库设计时,阿里巴巴编码规约建议使用gmt_create和gmt_modified命名时间字段,并设置为datetime类型,本文介绍了两种自动填充时间字段的实现方式:SQL级别和代码级别(使用MyBatis Plus),SQL级别通过设置默认值和更新值为CURRENT_TIMESTAMP
    2024-09-09
  • 十分钟理解Java中的动态代理

    十分钟理解Java中的动态代理

    十分钟帮助大家理解Java中的动态代理,什么是动态代理?感兴趣的小伙伴们可以参考一下
    2016-06-06

最新评论