JAVA:常见 JSON 库的技术详解

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"));// 序列化:将对象转换为 JSONObjectMapper 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"));// 序列化:将对象转换为 JSONGson 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"));// 序列化:将对象转换为 JSONJsonb 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.xdnf.cn/news/2743.html

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

相关文章

【贪心】【可行范围内最大边界】SCNU习题 P25.跳跃游戏

算法思想&#xff1a; 每次迭代更新可行至的最大范围r(r必保证>原位置&#xff09;&#xff0c;至到迭代结束&#xff0c;若r>length of array则说明可以跳跃至此 #include <iostream> #include <vector> #include <string> #include <sstre…

Redis 组网方式入门

文章目录 一、组网方式1. 单实例模式描述优点缺点适用场景 2. 主从复制模式&#xff08;Master-Slave Replication&#xff09;描述优点缺点适用场景基于docker的redis主从复制1. 配置主节点2. 配置从节点3. 查看节点状态4. 验证主从数据同步5. 查看同步进度 3. 哨兵模式&#…

【系统集成项目管理工程师教程】第5章 软件工程

软件工程是一门研究用工程化方法构建和维护有效、实用和高质量软件的学科&#xff0c;涵盖软件需求、设计、实现、测试、部署交付、质量管理和过程能力成熟度等方面&#xff0c;旨在提高软件生产率、质量并降低成本&#xff0c;确保软件项目的成功开发与维护。 5.1软件工程定义…

PowerDesigner使用教程:设置注释、默认值属性

使用场景: 进行表设计时&#xff0c;我们需要对字段增加注释、设置默认值 解决方案&#xff1a; 如下图设置即可实现

如果 MySQL 主库出现了问题,从库该何去何从呢?

🚀 博主介绍:大家好,我是无休居士!一枚任职于一线Top3互联网大厂的Java开发工程师! 🚀 🌟 在这里,你将找到通往Java技术大门的钥匙。作为一个爱敲代码技术人,我不仅热衷于探索一些框架源码和算法技巧奥秘,还乐于分享这些宝贵的知识和经验。 💡 无论你是刚刚踏…

C# 日志框架 NLog、log4net 和 Serilog对比

文章目录 前言NLog、log4net 和 Serilog 三个框架的详细对比:一、NLog优点:缺点:二、 log4net优点缺点三、Serilog优点缺点四、Serilog使用举例总结前言 NLog、log4net 和 Serilog 三个框架的详细对比: NLog、log4net 和 Serilog 是三个非常流行的 .NET 日志框架,它们各自…

本地缓存库分析(四):fastcache

文章目录 本系列前言设计索引和数组怎么判断是否被覆盖其他问题 源码走读数据结构setget 总结 本系列 本地缓存库分析&#xff08;一&#xff09;&#xff1a;golang-lru本地缓存库分析&#xff08;二&#xff09;&#xff1a;bigcache本地缓存库分析&#xff08;三&#xff0…

安科瑞5G基站直流叠光监控系统-安科瑞黄安南

基站现状和趋势 5G基站是专门提供5G网络服务的公用移动通信基站。5G基站主要用于提供5G空口协议功能&#xff0c;支持与用户设备、核心网之间的通信。按照逻辑功能划分&#xff0c;5G基站可分为5G基带单元与5G射频单元&#xff0c;二者之间可通过CPRI或eCPRI接口连接。 2019年…

Pr 视频效果:过渡

效果面板/视频效果/过渡 Video Effects/Transition Adobe Premiere Pro 的视频效果中&#xff0c;过渡 Transition效果组用于创建单个剪辑内过渡效果的一组视频效果。这些效果可以增强视频的视觉连贯性&#xff0c;添加创意性的视觉转换&#xff0c;为观众提供流畅的观看体验。…

DataX 的安装配置和使用 (详细版)

1&#xff0c;上传解压 1&#xff0c;开始上传安装包到你虚拟机上放置安装包的文件夹 2&#xff0c;开始解压 ,配置环境变量 1、上传 /opt/modules 2、解压 tar -zxvf datax.tar.gz -C /opt/installs 3、修改 vi /etc/profile 配置环境变量&#xff1a; export DAT…

zookeeper安装

安装之前&#xff1a;先关闭三台服务器的防火墙&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; systemctl stop firewalld systemctl disable firewalld 1)上传 /opt/modules下面 2&#xff09;解压 /opt/installs下面 tar -zxvf zookeeper-3.4.10.tar.gz …

Nature文章《deep learning》文章翻译

这篇文章是对Nature上《deep learning》文章的翻译。原作者 Yann LeCun, Yoshua Bengio& Geoffrey Hinton。 这篇文章的中心思想是深入探讨深度学习在机器学习中的革命性贡献&#xff0c;重点介绍其在特征学习、监督学习、无监督学习等方面的突破&#xff0c;并阐述其在图…

动态规划—整数拆分

class Solution {public int integerBreak(int n) {int[] dp new int[n1];dp[2] 1;for(int i 3; i< n; i){for(int j 1; j< i/2; j){//j拆i&#xff0c;只需要遍历到 i/2 就可以&#xff0c;后面没有必要遍历dp[i] Math.max(dp[i], Math.max(j*(i-j) , j*dp[i-j]));…

OceanBase V4.3.3,首个面向实时分析场景的GA版本发布

在10月23日举办的 OceanBase年度发布会 上&#xff0c;我们怀着激动之情&#xff0c;正式向大家宣布了 OceanBase 4.3.3 GA 版的正式发布&#xff0c;这也是OceanBase 为实时分析&#xff08;AP&#xff09;场景打造的首个GA版本。 2024 年初&#xff0c;我们推出了 4.3.0 版本…

儿童安全座椅行业全面深入分析

儿童安全座椅就是一种专为不同体重&#xff08;或年龄段&#xff09;的儿童设计&#xff0c;将孩子束缚在安全座椅内&#xff0c;能有效提高儿童乘车安全的座椅。欧洲强制性执行标准ECE R44/03的定义是&#xff1a;能够固定到机动车辆上&#xff0c;带有ISOFIX接口、LATCH接口的…

算法笔记:Day-09(初始动态规划)

509. 斐波那契数 斐波那契数 &#xff08;通常用 F(n) 表示&#xff09;形成的序列称为 斐波那契数列 。该数列由 0 和 1 开始&#xff0c;后面的每一项数字都是前面两项数字的和。也就是&#xff1a; F(0) 0&#xff0c;F(1) 1 F(n) F(n - 1) F(n - 2)&#xff0c;其中 …

HTTP和HTTPS 的作用和应用场景 (python 爬虫简单入门)

HTTP和HTTPS HTTP HTTP协议&#xff08;HyperText Transfer Protocol&#xff0c;超文本传输协议&#xff09;&#xff1a;是一种发布和接收 HTML页面的方法。 HTTP的端口号为80 HTTPS HTTPS&#xff08;Hypertext Transfer Protocol over Secure Socket Layer&#xff09;…

Java多线程编程(三)一>详解synchronized, 死锁,wait和notify

目录&#xff1a; 一.synchronized 的使用&#xff1a; 二. 常见死锁情况&#xff1a; 三 .如何避免死锁&#xff1a; 四.wait和notify 一.synchronized 的使用&#xff1a; 我们知道synchronized锁具有互斥的特点&#xff1a; synchronized 会起到互斥效果, 某个线程…

linux入门——“初识make”

make是linux中的自动化构建工具&#xff0c;一般来说系统会自带make&#xff0c;如果没有&#xff0c;那么可以使用命令“sudo apt install -y make”来安装。 1.初识make make使用的前提是维护makefile/Makefile文件&#xff0c;需要在自己的目录下自己创建。 我在此目录下创…

【K8S系列】Kubernetes 中 Pod 无法通过 Service 名称访问服务的 DNS 解析失败问题【已解决】

在 Kubernetes 中&#xff0c;Service 提供了一种稳定的方式&#xff0c;通过名称访问一组 Pod。当其他 Pod 无法通过 Service 名称访问服务&#xff0c;并且出现 DNS 解析失败时&#xff0c;通常会导致应用无法正常工作。本文将详细分析此问题的常见原因及其解决方案。 一、问…