JAVA:常见 JSON 库的技术详解

news2024/11/24 7:37:36

1、简述

在现代应用开发中,JSON(JavaScript Object Notation)已成为数据交换的标准格式。Java 提供了多种方式将对象转换为 JSON 或从 JSON 转换为对象,常见的库包括 Jackson、Gson 和 org.json。本文将介绍几种常用的 JSON 处理方式,并通过简单示例展示其应用。

在这里插入图片描述

2、什么是 JSON?

JSON 是一种轻量级的数据交换格式,使用键值对来表示数据。它易于人阅读和编写,同时也易于机器解析和生成。常见的 JSON 数据结构如下:

{
  "name": "John",
  "age": 30,
  "address": {
    "city": "New York",
    "zip": "10001"
  }
}

3、常见的JSON 库

3.1 使用 Jackson 进行 JSON 转换

Jackson 是 Java 中最流行的 JSON 解析库之一。它提供了强大的数据绑定功能,支持将 Java 对象与 JSON 之间进行转换。要使用 Jackson,请在 pom.xml 中添加以下依赖:

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

示例代码:

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;

public class JacksonExample {

    public static void main(String[] args) throws JsonProcessingException {
        // 创建 Person 对象
        Person person = new Person("John", 30, new Address("New York", "10001"));

        // 序列化:将对象转换为 JSON
        ObjectMapper objectMapper = new ObjectMapper();
        String jsonString = objectMapper.writeValueAsString(person);
        System.out.println("Serialized JSON: " + jsonString);

        // 反序列化:将 JSON 转换为对象
        Person deserializedPerson = objectMapper.readValue(jsonString, Person.class);
        System.out.println("Deserialized Person: " + deserializedPerson);
    }
}

class Person {
    private String name;
    private int age;
    private Address address;

    // 构造函数、getters、setters、toString 省略
}

class Address {
    private String city;
    private String zip;

    // 构造函数、getters、setters、toString 省略
}
3.2 使用 Gson 进行 JSON 转换

Gson 是 Google 提供的轻量级 JSON 处理库,它可以将 Java 对象与 JSON 字符串相互转换。要使用 Gson,请在 pom.xml 中添加以下依赖:

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

示例代码:

import com.google.gson.Gson;

public class GsonExample {

    public static void main(String[] args) {
        // 创建 Person 对象
        Person person = new Person("John", 30, new Address("New York", "10001"));

        // 序列化:将对象转换为 JSON
        Gson gson = new Gson();
        String jsonString = gson.toJson(person);
        System.out.println("Serialized JSON: " + jsonString);

        // 反序列化:将 JSON 转换为对象
        Person deserializedPerson = gson.fromJson(jsonString, Person.class);
        System.out.println("Deserialized Person: " + deserializedPerson);
    }
}

class Person {
    private String name;
    private int age;
    private Address address;

    // 构造函数、getters、setters、toString 省略
}

class Address {
    private String city;
    private String zip;

    // 构造函数、getters、setters、toString 省略
}
3.3 使用 org.json 进行 JSON 处理

org.json 是 Java 原生的 JSON 处理库,适用于处理简单的 JSON 数据。要使用 org.json,请在 pom.xml 中添加以下依赖:

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

示例代码:

import org.json.JSONObject;

public class OrgJsonExample {

    public static void main(String[] args) {
        // 创建 Person 对象的 JSON 字符串
        String jsonString = "{ \"name\": \"John\", \"age\": 30, \"address\": { \"city\": \"New York\", \"zip\": \"10001\" } }";

        // 解析 JSON 字符串
        JSONObject jsonObject = new JSONObject(jsonString);
        System.out.println("Name: " + jsonObject.getString("name"));
        System.out.println("Age: " + jsonObject.getInt("age"));
        JSONObject address = jsonObject.getJSONObject("address");
        System.out.println("City: " + address.getString("city"));
        System.out.println("Zip: " + address.getString("zip"));

        // 创建 JSON 对象
        JSONObject newPerson = new JSONObject();
        newPerson.put("name", "Jane");
        newPerson.put("age", 28);
        JSONObject newAddress = new JSONObject();
        newAddress.put("city", "Los Angeles");
        newAddress.put("zip", "90001");
        newPerson.put("address", newAddress);

        System.out.println("Created JSON: " + newPerson.toString());
    }
}
3.4 使用 JSON-B 进行 JSON 转换

JSON-B 是 Jakarta EE 提供的标准 JSON 绑定库,专为 Java 开发的 JSON 序列化和反序列化标准。要使用 JSON-B,请在 pom.xml 中添加以下依赖:

<dependency>
    <groupId>javax.json.bind</groupId>
    <artifactId>javax.json.bind-api</artifactId>
    <version>1.0</version>
</dependency>

示例代码:

import javax.json.bind.Jsonb;
import javax.json.bind.JsonbBuilder;

public class JsonBExample {

    public static void main(String[] args) {
        // 创建 Person 对象
        Person person = new Person("John", 30, new Address("New York", "10001"));

        // 序列化:将对象转换为 JSON
        Jsonb jsonb = JsonbBuilder.create();
        String jsonString = jsonb.toJson(person);
        System.out.println("Serialized JSON: " + jsonString);

        // 反序列化:将 JSON 转换为对象
        Person deserializedPerson = jsonb.fromJson(jsonString, Person.class);
        System.out.println("Deserialized Person: " + deserializedPerson);
    }
}

class Person {
    private String name;
    private int age;
    private Address address;

    // 构造函数、getters、setters、toString 省略
}

class Address {
    private String city;
    private String zip;

    // 构造函数、getters、setters、toString 省略
}
3.5 Moshi

Moshi 是 Square 公司提供的一款轻量级 JSON 库,专注于简单性和性能。它与 Gson 类似,但它在设计上更加严谨,并且更容易扩展。

import com.squareup.moshi.JsonAdapter;
import com.squareup.moshi.Moshi;

public class MoshiExample {
    public static void main(String[] args) throws Exception {
        // 创建 Moshi 实例
        Moshi moshi = new Moshi.Builder().build();
        JsonAdapter<Person> jsonAdapter = moshi.adapter(Person.class);

        // 序列化
        Person person = new Person("John", 30, new Address("New York", "10001"));
        String jsonString = jsonAdapter.toJson(person);
        System.out.println("Serialized JSON: " + jsonString);

        // 反序列化
        Person deserializedPerson = jsonAdapter.fromJson(jsonString);
        System.out.println("Deserialized Person: " + deserializedPerson);
    }
}

Moshi 强调简洁,同时支持 Kotlin 更加无缝的集成。

3.6 Flexjson

Flexjson 是一个快速和轻量的 JSON 库,专注于 Java 对象到 JSON 的序列化以及 JSON 到 Java 对象的反序列化。它允许你对序列化的字段进行高度控制,适合需要进行部分序列化或者处理复杂嵌套数据结构的场景。

import flexjson.JSONDeserializer;
import flexjson.JSONSerializer;

public class FlexjsonExample {
    public static void main(String[] args) {
        // 创建 Person 对象
        Person person = new Person("John", 30, new Address("New York", "10001"));

        // 序列化
        JSONSerializer serializer = new JSONSerializer();
        String jsonString = serializer.serialize(person);
        System.out.println("Serialized JSON: " + jsonString);

        // 反序列化
        JSONDeserializer<Person> deserializer = new JSONDeserializer<>();
        Person deserializedPerson = deserializer.deserialize(jsonString, Person.class);
        System.out.println("Deserialized Person: " + deserializedPerson);
    }
}

Flexjson 在复杂序列化需求时非常有用,比如需要不同的视图或包含/排除字段的序列化操作。

3.7 Json-simple

Json-simple 是一个简单、轻量级的 JSON 库,适合处理基本的 JSON 操作。虽然它的功能较为基础,但它的 API 非常简单,适合处理小型或快速开发场景。

import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;

public class JsonSimpleExample {
    public static void main(String[] args) throws Exception {
        // 创建 JSON 对象
        JSONObject person = new JSONObject();
        person.put("name", "John");
        person.put("age", 30);

        JSONObject address = new JSONObject();
        address.put("city", "New York");
        address.put("zip", "10001");
        person.put("address", address);

        // 序列化
        System.out.println("Serialized JSON: " + person.toJSONString());

        // 反序列化
        JSONParser parser = new JSONParser();
        JSONObject deserializedPerson = (JSONObject) parser.parse(person.toJSONString());
        System.out.println("Deserialized JSON: " + deserializedPerson);
    }
}

Json-simple 适合做简单的 JSON 解析,API 设计简洁但功能有限,适合小规模应用。

3.8 Jsoniter (Json-iterator)

Jsoniter 是一个性能优异的 JSON 库,其解析和序列化性能比 Jackson 还要快。它的优势在于处理大规模数据时速度非常快,适合高性能需求的场景。

import com.jsoniter.JsonIterator;
import com.jsoniter.output.JsonStream;

public class JsoniterExample {
    public static void main(String[] args) {
        // 序列化
        Person person = new Person("John", 30, new Address("New York", "10001"));
        String jsonString = JsonStream.serialize(person);
        System.out.println("Serialized JSON: " + jsonString);

        // 反序列化
        Person deserializedPerson = JsonIterator.deserialize(jsonString, Person.class);
        System.out.println("Deserialized Person: " + deserializedPerson);
    }
}

Jsoniter 非常注重性能,适用于对速度和内存使用要求非常高的场景。

3.9 Jettison

Jettison 是一个基于 StAX 的库,用于将 XML 转换为 JSON 或将 JSON 转换为 XML。它主要用于与 JSON 和 XML 之间相互转换的数据交换场景。

import org.codehaus.jettison.json.JSONObject;

public class JettisonExample {
    public static void main(String[] args) throws Exception {
        // 创建 JSON 对象
        JSONObject person = new JSONObject();
        person.put("name", "John");
        person.put("age", 30);
        
        JSONObject address = new JSONObject();
        address.put("city", "New York");
        address.put("zip", "10001");
        person.put("address", address);

        // 序列化输出
        System.out.println("Serialized JSON: " + person.toString());
    }
}

Jettison 主要用于解决与 XML 兼容的问题,适合需要同时处理这两种格式的数据应用。

3.10 Boon

Boon 是一个快速的 JSON 库,专注于速度和易用性。它支持简单的 API 来处理 JSON 数据,并且以其高速性能为特点。

import org.boon.Boon;

public class BoonExample {
    public static void main(String[] args) {
        // 序列化
        Person person = new Person("John", 30, new Address("New York", "10001"));
        String jsonString = Boon.toJson(person);
        System.out.println("Serialized JSON: " + jsonString);

        // 反序列化
        Person deserializedPerson = Boon.fromJson(jsonString, Person.class);
        System.out.println("Deserialized Person: " + deserializedPerson);
    }
}

Boon 提供了非常快速的 JSON 处理能力,适合需要高性能和易用性的场景。

4、总结

Java 提供了多种方式来处理 JSON 数据,每种库都有其独特的优势,除了常见的 Jackson 和 Gson,还有一些轻量级的 JSON 库如 Moshi、Flexjson 和 Json-simple,适合特定的场景。例如,Moshi 在与 Kotlin 集成时非常流畅,Jsoniter 在性能上非常出色,而 Flexjson 则在需要灵活控制序列化时表现优异。根据项目的需求选择合适的 JSON 处理库,可以帮助更高效地进行开发。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2229848.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

视频怎么去水印?7个视频去水印在线工具大比拼,宝藏工具推荐!

您是否正在寻找一款好用的视频去水印在线工具&#xff0c;却总是难以找到合适的去水印软件&#xff1f;别担心&#xff0c;今天在本文中小编将和大家分享一些去水印的小助手。很多人都觉得视频或图片上的水印十分烦人。如果您有着同样的烦恼&#xff0c;那么使用去水印工具将是…

如何一键更换ppt模板?掌握这2个ppt技巧快速搞定!

每当要制作ppt&#xff0c;很多人会第一时间去搜刮各种ppt模板&#xff0c;有时我们找到了一份貌似符合需求的模板&#xff0c;等到了ppt制作环节&#xff0c;才发现离我们的预期相距甚远&#xff0c;做到一半的ppt如何换模板呢&#xff1f; 想要在中途更换ppt模板&#xff0c;…

0基础入门linux文件系统

目录 文件系统简介 1. 文件系统类型 2. 文件系统结构 3. 文件系统的主要功能 4. 文件系统的使用 5. 文件系统的维护 6. 注意事项 简单举例 机械硬盘 物理结构介绍​编辑 CHS寻址 逻辑结构介绍 LBA寻址法 文件系统与磁盘管理 Boot Block Data block inode block…

2024年meme币走势分析:最后两个月的市场趋势与机会 #交易所#dapp#KOL社区合作

2024年即将步入尾声&#xff0c;meme币市场经历了显著的波动。对于加密市场来说&#xff0c;年底的走势尤为关键&#xff0c;尤其是meme币这种受市场情绪影响较大的加密资产。本文将从市场环境、宏观经济因素、投资者情绪、技术分析等方面分析meme币在2024年最后两个月的潜在走…

Cpp多态机制的深入理解(20)

文章目录 前言一、多态的概念二、多态的定义与实现两个必要条件虚函数虚函数的重写重写的三个例外override 和 final重载、重写(覆盖)、重定义(隐藏) 三、抽象类概念接口继承和实现继承 四、多态的原理虚表和虚表指针虚函数调用过程动态绑定与静态绑定 五、那...那单继承甚至多…

.net core 接口,动态接收各类型请求的参数

[HttpPost] public async Task<IActionResult> testpost([FromForm] object info) { //Postman工具测试结果&#xff1a; //FromBody,Postman的body只有rawjson时才进的来 //参数为空时&#xff0c;Body(form-data、x-www-form-urlencoded)解析到的数据也有所…

高清解压视频素材从哪儿下载?推荐5个高清推文素材资源网站

做抖音小说推文&#xff0c;哪里找爆款素材&#xff1f;作为一名从业多年的视频剪辑师&#xff0c;今天就来给大家揭秘可以下载爆款推文视频素材的网站&#xff0c;如果你也在苦苦找寻找&#xff0c;赶紧进来看看吧&#xff5e; 1. 稻虎网 首先是稻虎网&#xff0c;作为国内顶…

Python的全局锁GIL解析

Python的全局锁&#xff08;GIL&#xff09;是 CPython 解释器实现中的一个机制&#xff0c;用来确保任何时候只有一个线程执行 Python 字节码。这一机制存在于 CPython 中&#xff0c;主要是为了确保线程操作中的数据一致性&#xff0c;但也因此限制了多线程的并行执行效率。尤…

ELK的ElasticStack概念

目录 传送门前言一、ElasticStack是什么二、ElasticStack数据格式1、Elasticsearch的概述2、Elasticsearch核心概念&#xff08;1&#xff09;接近实时&#xff08;NRT&#xff09;&#xff08;2&#xff09;集群&#xff08;cluster&#xff09;&#xff08;3&#xff09;节点…

硅谷甄选(9)SKU模块

SKU模块 8.1 SKU静态 <template><el-card><el-table border style"margin: 10px 0px"><el-table-column type"index" label"序号" width"80px"></el-table-column><el-table-columnlabel"名称…

如何将ppt转换成word文档?8款ppt转word免费的软件大揭秘,值得收藏!

在日常办公中&#xff0c;将ppt转换成word文档的需求日益增长。这种需求源自多个方面&#xff0c;比如制作详尽的报告、创建课程讲义&#xff0c;或者将信息转化为可编辑的格式。作为一种普遍使用的演示工具&#xff0c;ppt在许多商业环境中扮演着重要角色。然而&#xff0c;随…

pandas——DataFrame

一、dataframe &#xff08;一&#xff09;创建dataframe file.csv Name,Age,City Alice,30,New York Bob,25,Los Angeles Charlie,35,Chicagoimport pandas as pd 1.使用字典创建DataFrame&#xff1a; 其中字典的键是列名&#xff0c;值是数据列表。print(1.使用字典创建D…

vxe-table v4.8+ 与 v3.10+ 虚拟滚动支持动态行高,虚拟渲染更快了

Vxe UI vue vxe-table v4.8 与 v3.10 解决了老版本虚拟滚动不支持动态行高的问题&#xff0c;重构了虚拟渲染&#xff0c;渲染性能大幅提升了&#xff0c;行高自适应和列宽拖动都支持&#xff0c;大幅降低虚拟渲染过程中的滚动白屏&#xff0c;大量数据列表滚动更加流畅。 自适…

关于武汉芯景科技有限公司的马达驱动芯片AT6237开发指南(兼容DRV8837)

一、芯片引脚介绍 1.芯片引脚 二、系统结构图 三、功能描述 逻辑功能

青出于“蓝”的合资第一新能源,“换壳”背后有门道

文/王俣祺 导语&#xff1a;千呼万唤始出来的新能源“马6”终于亮相了&#xff0c;这款马自达EZ-6本以为凭借马自达多年来在国内市场深耕的底蕴可以收获一片支持&#xff0c;但最近却深陷“换壳”风波。那么今天我们就一起看看&#xff0c;这款马自达EZ-6和被冠以“原型”的深蓝…

Github上的十大RAG(信息检索增强生成)框架

信息检索增强生成(Retrieval-Augmented Generation,简称RAG)是一种强大的技术,能够显著提升大型语言模型的性能。RAG框架巧妙地结合了基于检索的系统和生成模型的优势,可以生成更加准确、符合上下文、实时更新的响应。随着对先进人工智能解决方案需求的不断增长,GitHub上涌现出…

【小白学机器学习28】 统计学脉络+ 总体+ 随机抽样方法

目录 参考书&#xff0c;学习书 0 统计学知识大致脉络 1 个体---抽样---整体 1.1 关于个体---抽样---整体&#xff0c;这个三段式关系 1.2 要明白&#xff0c;自然界的整体/母体是不可能被全部认识的 1.2.1 不要较真&#xff0c;如果是人为定义的一个整体&#xff0c;是可…

5、片元着色器之基础光照模型:Phong模型和Blinn-Phong模型

1、什么是Phong光照模型&#xff1f; Phong模型就是在兰伯特模型的基础上增加了镜面反射光的计算。具体来说&#xff0c;兰伯特模型只考虑漫反射光&#xff0c;而Phong模型在此基础上引入了镜面反射光的概念&#xff0c;以模拟光线在光滑表面反射时产生的高光效果。镜面反射光的…

Ubuntu使用Qt虚拟键盘,支持中英文切换

前言 ​ 最近领导给了个需求&#xff0c;希望将web嵌入到客户端里面&#xff0c;做一个客户端外壳&#xff0c;可以控制程序的启动、停止、重启&#xff0c;并且可以调出键盘在触摸屏上使用(我们的程序虽然是BS架构&#xff0c;但程序还是运行在本地工控机上的)&#xff0c;我…

ES(ElaticSearch)详解(含工作原理、基本知识、常见问题和优化方法)

文章目录 一、Lucene 和 ELK 的组成二、ES 配置文件参数解读三、ES 基本知识1、索引&#xff08;Index&#xff09;&#xff1a;类似于关系型数据库的工作表2、类型&#xff08;Type&#xff09;&#xff1a;废弃3、文档&#xff08;Document&#xff09;&#xff1a;类似于关系…