如何在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实现字符串倒序输出的四种方法汇总,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-06-06
  • 关于Java中BeanMap进行对象与Map的相互转换问题

    关于Java中BeanMap进行对象与Map的相互转换问题

    这篇文章主要介绍了利用BeanMap进行对象与Map的相互转换,通过net.sf.cglib.beans.BeanMap类中的方法来转换,效率极高,本文给大家分享实现代码,感兴趣的朋友一起看看吧
    2022-03-03
  • Mybatis有查询结果但存不进实体类的解决方案

    Mybatis有查询结果但存不进实体类的解决方案

    这篇文章主要介绍了Mybatis有查询结果但存不进实体类的解决方案,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-11-11
  • Java开发者进行线上问题排查的50个常用命令推荐

    Java开发者进行线上问题排查的50个常用命令推荐

    在生产环境中,当Java应用出现性能下降、响应缓慢、内存泄漏或崩溃等问题时,快速有效的问题排查至关重要,本文汇总了50个最常用的命令,有需要的可以了解一下
    2025-05-05
  • java中文分词之正向最大匹配法实例代码

    java中文分词之正向最大匹配法实例代码

    中文分词应用很广泛,网上也有很多开源项目,下面这篇文章主要给大家介绍了关于java中文分词之正向最大匹配法的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考借鉴,下面随着小编来一起学习学习吧。
    2017-11-11
  • java 数据结构基本算法希尔排序

    java 数据结构基本算法希尔排序

    这篇文章主要介绍了数据结构基本算法希尔排序的相关资料,需要的朋友可以参考下
    2017-08-08
  • spring中定时任务taskScheduler的详细介绍

    spring中定时任务taskScheduler的详细介绍

    这篇文章主要介绍了spring中定时任务taskScheduler的相关资料,文中通过示例代码介绍的很详细,相信对大家具有一定的参考价值,有需要的朋友们下面来一起看看吧。
    2017-02-02
  • Java基于命令模式实现邮局发信功能详解

    Java基于命令模式实现邮局发信功能详解

    这篇文章主要介绍了Java基于命令模式实现邮局发信功能,较为详细的分析了命令行模式的概念、原理并结合实例形式分析了Java使用命令行模式实现邮局发信功能的相关操作技巧与注意事项,需要的朋友可以参考下
    2018-04-04
  • Java多线程实现之线程调度的使用

    Java多线程实现之线程调度的使用

    Java多线程中线程调度是一个核心概念,它决定了线程如何获得CPU资源并执行,合理的线程调度策略能够充分发挥多核处理器的性能,提高程序的执行效率,本文介绍了Java线程调度的原理、机制及相关的API,感兴趣的可以了解一下
    2025-12-12
  • java实现网页爬虫的示例讲解

    java实现网页爬虫的示例讲解

    下面小编就为大家带来一篇java实现网页爬虫的示例讲解。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-08-08

最新评论