Java JSON解析
JSON (JavaScript Object Notation) 是一种轻量级的数据交换格式,在现代Web应用中被广泛使用。作为一名Java开发者,掌握JSON数据的解析和生成是必不可少的技能,特别是在开发需要与RESTful API交互的应用程序时。
JSON简介
JSON是一种基于文本的数据格式,具有易于阅读和编写的特点。它由两种结构组成:
- 名称/值对的集合:在各种语言中,这通常被理解为对象、记录、结构等
- 有序的值列表:大多数语言中,这被实现为数组、向量或列表等
JSON的基本语法示例:
{
"name": "张三",
"age": 25,
"isStudent": false,
"courses": ["Java", "Python", "数据库"],
"address": {
"city": "北京",
"zipcode": "100000"
}
}
Java 中的JSON处理库
Java本身 不提供内置的JSON处理功能,但有几个流行的第三方库可用于JSON操作:
- Jackson - 功能全面,性能高
- Gson - 由Google开发,使用简单
- org.json - 轻量级JSON库
- JSON-B - Java EE的标准JSON绑定API
下面我们将详细介绍如何使用这些库进行JSON处理。
使用Jackson处理JSON
Jackson是Java中最受欢迎的JSON处理库之一,提供了全面的功能和高性能。
添加Jackson依赖
首先,需要在项目中添加Jackson依赖:
对于Maven项目:
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.13.3</version>
</dependency>
对于Gradle项目:
implementation 'com.fasterxml.jackson.core:jackson-databind:2.13.3'
JSON解析为Java对象(反序列化)
使用Jackson将JSON字符串转换为Java对象:
import com.fasterxml.jackson.databind.ObjectMapper;
// 首先定义一个Java类
public class Student {
private String name;
private int age;
private boolean isStudent;
private List<String> courses;
private Address address;
// 省略getter和setter方法
public static class Address {
private String city;
private String zipcode;
// 省略getter和setter方法
}
}
// 然后使用ObjectMapper解析JSON
public class JacksonDemo {
public static void main(String[] args) {
try {
String json = "{\"name\":\"张三\",\"age\":25,\"isStudent\":false,"
+ "\"courses\":[\"Java\",\"Python\",\"数据库\"],"
+ "\"address\":{\"city\":\"北京\",\"zipcode\":\"100000\"}}";
ObjectMapper objectMapper = new ObjectMapper();
Student student = objectMapper.readValue(json, Student.class);
System.out.println("姓名: " + student.getName());
System.out.println("年龄: " + student.getAge());
System.out.println("城市: " + student.getAddress().getCity());
} catch (Exception e) {
e.printStackTrace();
}
}
}
输出结果:
姓名: 张三
年龄: 25
城市: 北京
Java 对象转换为JSON(序列化)
将Java对象转换为JSON字符串:
public class JacksonSerializeDemo {
public static void main(String[] args) {
try {
// 创建对象
Student student = new Student();
student.setName("李四");
student.setAge(22);
student.setStudent(true);
List<String> courses = new ArrayList<>();
courses.add("Web开发");
courses.add("数据结构");
student.setCourses(courses);
Address address = new Address();
address.setCity("上海");
address.setZipcode("200000");
student.setAddress(address);
// 转换为JSON
ObjectMapper objectMapper = new ObjectMapper();
String jsonString = objectMapper.writeValueAsString(student);
System.out.println(jsonString);
} catch (Exception e) {
e.printStackTrace();
}
}
}
输出结果:
{"name":"李四","age":22,"student":true,"courses":["Web开发","数据结构"],"address":{"city":"上海","zipcode":"200000"}}
提示
为了使输出的JSON更加美观,你可以使用objectMapper.writerWithDefaultPrettyPrinter().writeValueAsString(student)
,这会生成格式化的JSON字符串。
使用Gson处理JSON
Gson是由Google开发的JSON处理库,以其简单直观的API而受到欢迎。
添加Gson依赖
为项目添加Gson依赖:
对于Maven项目:
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.9.0</version>
</dependency>
对于Gradle项目:
implementation 'com.google.code.gson:gson:2.9.0'
使用Gson进行JSON解析
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import java.lang.reflect.Type;
import java.util.List;
public class GsonDemo {
public static void main(String[] args) {
// 创建Gson对象
Gson gson = new Gson();
// JSON字符串转Java对象
String jsonString = "{\"name\":\"王五\",\"age\":30}";
Student student = gson.fromJson(jsonString, Student.class);
System.out.println("姓名: " + student.getName());
// Java对象转JSON字符串
Student newStudent = new Student();
newStudent.setName("赵六");
newStudent.setAge(28);
String json = gson.toJson(newStudent);
System.out.println(json);
// 解析JSON数组
String jsonArray = "[{\"name\":\"学生1\",\"age\":20},{\"name\":\"学生2\",\"age\":22}]";
Type studentListType = new TypeToken<List<Student>>(){}.getType();
List<Student> studentList = gson.fromJson(jsonArray, studentListType);
for (Student s : studentList) {
System.out.println(s.getName() + ": " + s.getAge());
}
}
}
输出结果:
姓名: 王五
{"name":"赵六","age":28}
学生1: 20
学生2: 22
使用org.json处理JSON
org.json是一个轻量级的JSON处理库,是JSON官方参考实现的Java版本。
添加org.json依赖
对于Maven项目:
<dependency>
<groupId>org.json</groupId>
<artifactId>json</artifactId>
<version>20220320</version>
</dependency>
对于Gradle项目:
implementation 'org.json:json:20220320'
使用org.json处理JSON
import org.json.JSONArray;
import org.json.JSONObject;
public class OrgJsonDemo {
public static void main(String[] args) {
// 创建JSONObject
JSONObject student = new JSONObject();
student.put("name", "张三");
student.put("age", 25);
student.put("isGraduate", false);
JSONArray courses = new JSONArray();
courses.put("Java编程");
courses.put("Web开发");
student.put("courses", courses);
// 输出JSON字符串
String jsonString = student.toString();
System.out.println(jsonString);
// 解析JSON字符串
String inputJson = "{\"name\":\"李四\",\"age\":22,\"courses\":[\"数据库\",\"操作系统\"]}";
JSONObject parsedJson = new JSONObject(inputJson);
String name = parsedJson.getString("name");
int age = parsedJson.getInt("age");
JSONArray parsedCourses = parsedJson.getJSONArray("courses");
System.out.println("姓名: " + name);
System.out.println("年龄: " + age);
System.out.println("课程: ");
for (int i = 0; i < parsedCourses.length(); i++) {
System.out.println("- " + parsedCourses.getString(i));
}
}
}
输出结果:
{"name":"张三","age":25,"isGraduate":false,"courses":["Java编程","Web开发"]}
姓名: 李四
年龄: 22
课程:
- 数据库
- 操作系统