在 Java 开发中,JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,具有易于阅读和编写,同时也易于机器解析和生成的特点。
基本概念
JSON 采用完全独立于编程语言的文本格式来存储和表示数据,它基于 JavaScript 的一个子集,但现在已经成为一种通用的数据格式,广泛应用于各种编程语言和系统之间的数据交互,在 Java 开发中常用于前后端数据传输、配置文件存储等场景。
数据类型
JSON 支持以下几种基本数据类型:
-
对象(Object) :由键值对组成,用花括号
{}包围,键和值之间用冒号:分隔,多个键值对之间用逗号,分隔。键必须是字符串,值可以是任意 JSON 数据类型。{ "name": "John", "age": 30, "isStudent": false } -
数组(Array) :由值的有序列表组成,用方括号
[]包围,值之间用逗号,分隔。数组中的值可以是任意 JSON 数据类型。[1, 2, 3, "apple", "banana"] -
字符串(String) :由双引号
"包围的 Unicode 字符序列。"Hello, World!" -
数字(Number) :可以是整数或浮点数,不使用引号。
42 3.14 -
布尔值(Boolean) :表示真或假,分别用
true和false表示。true false -
空值(Null) :用
null表示。null
Java 中处理 JSON 的方式
在 Java 中,有许多库可以用来处理 JSON 数据,以下是一些常用的库及其示例:
Jackson
Jackson 是一个流行的 Java JSON 处理库,它提供了简单易用的 API 来实现 JSON 数据的序列化和反序列化。
import com.fasterxml.jackson.databind.ObjectMapper;
import java.io.IOException;
// 定义一个 Java 类来表示 JSON 对象
class Person {
private String name;
private int age;
// 构造函数、getter 和 setter 方法
public Person() {}
public Person(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 JacksonExample {
public static void main(String[] args) {
ObjectMapper objectMapper = new ObjectMapper();
// Java 对象转 JSON 字符串
Person person = new Person("John", 30);
try {
String json = objectMapper.writeValueAsString(person);
System.out.println("Java 对象转 JSON 字符串: " + json);
// JSON 字符串转 Java 对象
Person newPerson = objectMapper.readValue(json, Person.class);
System.out.println("JSON 字符串转 Java 对象: " + newPerson.getName() + ", " + newPerson.getAge());
} catch (IOException e) {
e.printStackTrace();
}
}
}
Gson
Gson 是 Google 开发的一个 Java 库,用于将 Java 对象转换为 JSON 字符串,反之亦然。
import com.google.gson.Gson;
// 定义一个 Java 类来表示 JSON 对象
class Student {
private String name;
private int grade;
// 构造函数、getter 和 setter 方法
public Student() {}
public Student(String name, int grade) {
this.name = name;
this.grade = grade;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getGrade() {
return grade;
}
public void setGrade(int grade) {
this.grade = grade;
}
}
public class GsonExample {
public static void main(String[] args) {
Gson gson = new Gson();
// Java 对象转 JSON 字符串
Student student = new Student("Alice", 8);
String json = gson.toJson(student);
System.out.println("Java 对象转 JSON 字符串: " + json);
// JSON 字符串转 Java 对象
Student newStudent = gson.fromJson(json, Student.class);
System.out.println("JSON 字符串转 Java 对象: " + newStudent.getName() + ", " + newStudent.getGrade());
}
}
其它数据格式
除了 JSON 外,还有不少类似的数据交换格式,它们各有特点和适用场景:
XML(可扩展标记语言)
-
简介:XML 是一种标记语言,设计宗旨是传输和存储数据,它具有自我描述性,非常适合在不同的系统之间交换数据。
-
格式特点:使用标签来描述数据,标签由尖括号包围,有开始标签和结束标签,数据位于标签之间。可以自定义标签名,具有良好的扩展性。
-
示例
<book> <title>Java 编程思想</title> <author>Bruce Eckel</author> <year>2007</year> </book> -
应用场景:常用于配置文件(如 Spring 框架的配置文件)、数据交换(如 Web 服务中的 SOAP 协议使用 XML 进行数据传输)等。
YAML(YAML Ain't Markup Language)
-
简介:YAML 是一种人类可读的数据序列化格式,它强调以简洁的方式表达数据,常用于配置文件。
-
格式特点 :使用缩进表示数据的层次结构,通过短横线
-表示列表项,使用冒号:分隔键和值。支持多种数据类型,如字符串、数字、布尔值等。 -
示例
book:
title: Java 编程思想
author: Bruce Eckel
year: 2007 -
应用场景:广泛用于各种编程语言的配置文件,如 Docker Compose 文件、Kubernetes 配置文件等。
CSV(逗号分隔值)
-
简介:CSV 是一种以纯文本形式存储表格数据的简单文件格式,通常用于数据的导入和导出。
-
格式特点:数据以行和列的形式组织,每行代表一条记录,列之间用逗号分隔。第一行通常是列名。
-
示例
title,author,year
Java 编程思想,Bruce Eckel,2007
Effective Java,Joshua Bloch,2008 -
应用场景:常用于数据的批量导入导出,如数据库备份、电子表格数据交换等。
TOML(Tom's Obvious, Minimal Language)
-
简介:TOML 旨在成为一种语义化的配置文件格式,易于阅读和编写,同时也易于解析。
-
格式特点 :使用方括号
[]表示表(类似于 JSON 中的对象),键值对使用等号=分隔。支持多种数据类型,如字符串、数字、布尔值、数组等。 -
示例
[book]
title = "Java 编程思想"
author = "Bruce Eckel"
year = 2007 -
应用场景 :常用于各种编程语言的配置文件,如 Rust 项目的
Cargo.toml文件。