当前位置: 首页 > web >正文

Java 中的 JSON 转换

在现代软件开发中,JSON(JavaScript Object Notation)已经成为数据交换的事实标准。其简洁的语法和跨语言的兼容性,使其在前后端交互、微服务通信以及数据存储等场景中被广泛使用。对于 Java 开发者而言,熟练掌握 JSON 转换技术是一项必备技能。本文将深入探讨 Java 中 JSON 转换的各种方式,结合常见的库和工具,带你从基础概念走向实战应用。​

一、JSON 基础概念回顾​

JSON 是一种轻量级的数据交换格式,采用键值对的形式存储数据,易于阅读和编写,同时也方便机器解析和生成。它主要有两种结构:​

  1. 对象:由花括号{}包围,包含一系列键值对,键和值之间用冒号:分隔,不同键值对之间用逗号,分隔,例如{"name": "John", "age": 30}。​
  2. 数组:由方括号[]包围,数组元素可以是不同类型的数据,包括对象、数组、字符串、数字等,例如["apple", "banana", {"color": "red", "s​ize" "medium"}]。​

二、Java 原生 JSON 转换​

Java 从 JDK 7 开始,引入了javax.json API,提供了处理 JSON 数据的原生支持。使用javax.json进行 JSON 转换,需要通过构建器模式创建 JSON 对象和 JSON 数组。以下是一个简单示例:

import javax.json.Json;
import javax.json.JsonObject;
import javax.json.JsonArray;public class JsonNativeExample {public static void main(String[] args) {// 创建JSON对象JsonObject jsonObject = Json.createObjectBuilder().add("name", "Alice").add("age", 25).build();System.out.println(jsonObject.toString());// 创建JSON数组JsonArray jsonArray = Json.createArrayBuilder().add("red").add("green").add("blue").build();System.out.println(jsonArray.toString());}
}

上述代码展示了如何使用 Java 原生 API 创建 JSON 对象和 JSON 数组。在反序列化时,也可以通过JsonReader来解析 JSON 字符串。但javax.json API 在使用上相对繁琐,尤其是处理复杂对象和嵌套结构时,开发效率较低。​

三、Fastjson 实现 JSON 转换​

(一)简介与优势​

Fastjson 是阿里巴巴开发的高性能 JSON 处理库,以其快速的序列化和反序列化速度而闻名。它提供了简洁的 API,能够方便地将 Java 对象与 JSON 格式进行相互转换,在处理大量数据时表现出色。​

(二)具体示例​

1.序列化:将 Java 对象转换为 JSON 字符串。

import com.alibaba.fastjson.JSON;class User {private String name;private int age;public User(String name, int age) {this.name = name;this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}
}public class FastjsonExample {public static void main(String[] args) {User user = new User("Bob", 30);String jsonString = JSON.toJSONString(user);System.out.println(jsonString);}
}

2.反序列化:将 JSON 字符串转换为 Java 对象。

import com.alibaba.fastjson.JSON;class User {private String name;private int age;// 省略getter和setter方法public User(String name, int age) {this.name = name;this.age = age;}
}public class FastjsonDeserializationExample {public static void main(String[] args) {String json = "{\"name\":\"Charlie\",\"age\":35}";User user = JSON.parseObject(json, User.class);System.out.println(user.getName() + " " + user.getAge());}
}

四、Jackson 实现 JSON 转换​

(一)简介与特点​

Jackson 是另一个广泛使用的 Java JSON 处理库,它功能丰富,支持多种数据格式,并且具有良好的扩展性。Jackson 提供了数据绑定(Data Binding)功能,可以将 JSON 数据直接映射到 Java 对象,反之亦然。​

(二)使用示例​

首先需要在项目中添加 Jackson 依赖,以 Maven 项目为例:

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

1.序列化:

import com.fasterxml.jackson.databind.ObjectMapper;class Product {private String name;private double price;public Product(String name, double price) {this.name = name;this.price = price;}public String getName() {return name;}public void setName(String name) {this.name = name;}public double getPrice() {return price;}public void setPrice(double price) {this.price = price;}
}public class JacksonExample {public static void main(String[] args) throws Exception {ObjectMapper objectMapper = new ObjectMapper();Product product = new Product("Laptop", 999.99);String json = objectMapper.writeValueAsString(product);System.out.println(json);}
}

2.反序列化:

import com.fasterxml.jackson.databind.ObjectMapper;class Product {private String name;private double price;// 省略getter和setter方法public Product(String name, double price) {this.name = name;this.price = price;}
}public class JacksonDeserializationExample {public static void main(String[] args) throws Exception {ObjectMapper objectMapper = new ObjectMapper();String json = "{\"name\":\"Smartphone\",\"price\":499.99}";Product product = objectMapper.readValue(json, Product.class);System.out.println(product.getName() + " " + product.getPrice());}
}

五、Gson 实现 JSON 转换​

(一)简介与优势​

Gson 是 Google 开发的 JSON 处理库,它的设计目标是简单易用,尤其适合初学者。Gson 提供了自动类型推断功能,在处理简单的 JSON 转换时非常方便。​

(二)使用示例​

同样先添加 Gson 依赖(以 Maven 为例):

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

1.序列化:

import com.google.gson.Gson;class Book {private String title;private String author;public Book(String title, String author) {this.title = title;this.author = author;}public String getTitle() {return title;}public void setTitle(String title) {this.title = title;}public String getAuthor() {return author;}public void setAuthor(String author) {this.author = author;}
}public class GsonExample {public static void main(String[] args) {Gson gson = new Gson();Book book = new Book("Java Programming", "John Doe");String json = gson.toJson(book);System.out.println(json);}
}

2.反序列化:

import com.google.gson.Gson;class Book {private String title;private String author;// 省略getter和setter方法public Book(String title, String author) {this.title = title;this.author = author;}
}public class GsonDeserializationExample {public static void main(String[] args) {Gson gson = new Gson();String json = "{\"title\":\"Python Basics\",\"author\":\"Jane Smith\"}";Book book = gson.fromJson(json, Book.class);System.out.println(book.getTitle() + " " + book.getAuthor());}
}

六、不同库的对比与选择​

库名​

性能​

易用性​

功能丰富度​

适用场景​

Fastjson​

高​

较高​

中等​

对性能要求高,处理大量数据的场景​

Jackson​

较高​

中等​

高​

复杂项目,需要高度定制化的场景​

Gson​

中等​

高​

中等​

简单项目,初学者友好​

在实际项目中,选择哪种 JSON 处理库需要综合考虑项目的性能需求、复杂度以及团队成员的技术栈。如果追求极致性能,Fastjson 是不错的选择;如果项目较为复杂,需要丰富的功能和扩展性,Jackson 更为合适;而对于简单项目和初学者,Gson 的易用性则是一大优势。​

七、总结​

Java 中的 JSON 转换是一项基础且重要的技术,掌握不同的 JSON 处理库和工具,能够帮助开发者在不同场景下高效地处理数据。从 Java 原生的javax.json API 到 Fastjson、Jackson、Gson 等第三方库,每种方式都有其特点和适用范围。通过本文的介绍和示例,希望你对 Java 中的 JSON 转换有更深入的理解,在实际开发中能够根据需求选择合适的方案,提升开发效率和代码质量。​

如果你在 JSON 转换过程中遇到任何问题,或者有自己的经验分享,欢迎在评论区留言交流!

http://www.xdnf.cn/news/14456.html

相关文章:

  • 《深度剖析:SCSS中混入(Mixin)为浏览器前缀赋能》
  • LeetCode 第78题:子集
  • android CALL 之 RIL、TELEDCOM、PHONE
  • 详细讲解BUUCTF-ciscn_2019_n_1
  • 6.11小测(html、css)
  • 【数据结构中哈希函数与哈希表】
  • 中国风系列简约淡雅通用PPT模版分享
  • 【Linux手册】进程的状态:从创建到消亡的“生命百态”
  • K8s集群平台
  • MySQL事务:从原理到实践
  • Elasticsearch9 + 通义大模型实现语义检索操作详解
  • LoRA核心公式
  • 语言模型是怎么工作的?通俗版原理解读!
  • 2.1 Windows VS2019编译FFmpeg 4.4.1
  • Qt QComboBox下拉多选
  • 【项目】仿muduo库one thread one loop式并发服务器前置知识准备
  • OmniMeetProTrack 全维会议链智能追录系统——山东大学软件学院创新实训项目博客(六)
  • 机器学习实验报告4-Logistic 回归算法
  • 如何设计一个既提供绘图Tools又提供example_data的MCP服务器:
  • vulnerable_docker_containement(hard难度)MSF内网穿透、docker逃逸、wpscan爆破。
  • vscode python debugger 如何调试老版本python
  • 论文略读:Personality Alignment of Large Language Models
  • Git里面Stash Changes和UnStash Changes使用
  • LiteRT-LM边缘平台上高效运行语言模型
  • 【Android】 BindService源码流程
  • 如何在Windows上使用qemu安装ubuntu24.04服务器?
  • 408第一季 - 数据结构 - B树与B+树
  • 数据结构---B树
  • 卷积神经网络中的通道注意力机制
  • [游戏实时地图] 地图数据 | 兴趣点数据 | 虚幻引擎SDK接口