Java中提取JSON数据的多种方法详解
在当今的软件开发中,JSON(JavaScript Object Notation)已成为数据交换的事实标准,无论是调用RESTful API、读取配置文件,还是在前后端分离架构中传输数据,我们都不可避免地需要在Java程序中处理JSON数据,Java究竟该如何“取出”(解析)JSON中的数据呢?本文将详细介绍几种主流且实用的方法,从基础到进阶,助你轻松。
准备工作:引入JSON库
Java标准库本身不直接支持JSON,因此我们需要借助第三方库,目前最流行、最推荐的库是 Google Gson 和 Jackson,Java EE 8 引入了标准的 javax.json API,我们主要以 Gson 和 Jackson 为例进行讲解。
你需要在你的项目中添加相应库的依赖,如果你使用Maven,可以在 pom.xml 中添加:
Gson 依赖:
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.10.1</version> <!-- 请使用最新版本 -->
</dependency>
Jackson 依赖:
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.15.2</version> <!-- 请使用最新版本 -->
</dependency>
方法一:使用 Google Gson (简单易用)
Gson 以其简洁的API和强大的功能而广受欢迎,特别适合快速上手。
场景1:解析简单的JSON字符串
假设我们有以下JSON字符串:
{
"name": "张三",
"age": 30,
"isStudent": false
}
我们想取出 name 和 age。
步骤:
-
创建一个与JSON结构对应的Java类(POJO - Plain Old Java Object)。
public class Person { private String name; private int age; private boolean isStudent; // 必须有无参构造函数 public Person() {} // Getters 和 Setters 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 boolean isStudent() { return isStudent; } public void setStudent(boolean student) { isStudent = student; } // (可选) 重写 toString() 方便打印 @Override public String toString() { return "Person{" + "name='" + name + '\'' + ", age=" + age + ", isStudent=" + isStudent + '}'; } } -
使用Gson进行解析。
import com.google.gson.Gson; public class GsonExample { public static void main(String[] args) { String jsonString = "{\"name\":\"张三\",\"age\":30,\"isStudent\":false}"; // 1. 创建 Gson 实例 Gson gson = new Gson(); // 2. 直接将JSON字符串解析为Java对象 Person person = gson.fromJson(jsonString, Person.class); // 3. 通过对象的getter方法取出数据 System.out.println("姓名: " + person.getName()); System.out.println("年龄: " + person.getAge()); System.out.println("是否是学生: " + person.isStudent()); // 打印整个对象 System.out.println(person); } }
场景2:解析复杂的JSON(嵌套对象和数组)
当JSON结构变得复杂时,Gson同样能轻松应对。
JSON 示例:
{
"id": 101,: "Java编程思想",
"author": {
"firstName": "Bruce",
"lastName": "Eckel"
},
"tags": ["编程", "Java", "经典"]
}
步骤:
-
创建对应的Java类。
public class Book { private int id; private String title; private Author author; // 嵌套对象 private List<String> tags; // 数组 // Getters, Setters, toString()... } public class Author { private String firstName; private String lastName; // Getters, Setters, toString()... } -
使用Gson解析。
String json = "{...}"; // 上面的复杂JSON Gson gson = new Gson(); Book book = gson.fromJson(json, Book.class); System.out.println("书名: " + book.getTitle()); System.out.println("作者: " + book.getAuthor().getFirstName() + " " + book.getAuthor().getLastName()); System.out.println("标签: " + book.getTags());
方法二:使用 Jackson (功能强大,高性能)
Jackson 是目前应用最广泛的JSON库,性能优异,功能也非常全面,是Spring Framework等许多知名框架的默认选择。
场景1:解析简单的JSON字符串
同样使用第一个 Person 的例子。
步骤:
-
创建POJO类(与Gson中完全相同)。
-
使用Jackson进行解析。
import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; public class JacksonExample { public static void main(String[] args) { String jsonString = "{\"name\":\"张三\",\"age\":30,\"isStudent\":false}"; // 1. 创建 ObjectMapper 实例 ObjectMapper objectMapper = new ObjectMapper(); try { // 2. 将JSON字符串解析为Java对象 Person person = objectMapper.readValue(jsonString, Person.class); // 3. 通过getter方法取出数据 System.out.println("姓名: " + person.getName()); System.out.println("年龄: " + person.getAge()); System.out.println("是否是学生: " + person.isStudent()); System.out.println(person); } catch (JsonProcessingException e) { e.printStackTrace(); } } }
可以看到,Jackson的API与Gson非常相似,核心都是 readValue 方法,对于复杂的JSON解析,Jackson与Gson的思路也完全一致,都是通过创建嵌套的POJO类来映射结构。
方法三:使用 JsonPath (直接查询,无需POJO)
JSON结构非常复杂或者多变,我们只需要其中一两个值,如果为了这零星几个值而创建一整个POJO类,显得有些“杀鸡用牛刀”,这时,JsonPath 就派上用场了。
JsonPath 提供了一种类似XPath的语法,让你可以直接从JSON文档中“查询”数据,无需定义Java类。
添加JsonPath依赖:
<dependency>
<groupId>com.jayway.jsonpath</groupId>
<artifactId>json-path</artifactId>
<version>2.8.0</version> <!-- 请使用最新版本 -->
</dependency>
示例:
import com.jayway.jsonpath.JsonPath;
import com.jayway.jsonpath.PathNotFoundException;
import net.minidev.json.JSONArray;
public class JsonPathExample {
public static void main(String[] args) {
String complexJson = "{\n" +
" \"store\": {\n" +
" \"book\": [\n" +
" { \"category\": \"reference\",\n" +
" \"author\": \"Nigel Rees\",\n" +
" \"title\": \"Sayings of the Century\",\n" +
" \"price\": 8.95\n" +
" },\n" +
" { \"category\": \"fiction\",\n" +
" \"author\": \"Evelyn Waugh\",\n" +
" \"title\": \"Sword of Honour\",\n" +
" \"price\": 12.99\n" +
" }\n" +
" ],\n" +
" \"bicycle\": {\n" +
" \"color\": \"red\",\n" +
" \"price\": 19.95\n" +
" }\n" +
" }\n" +
"}";
// 1. 获取第一本书的作者
String author = JsonPath.parse(complexJson).read("$.store.book[0].author");
System.out.println("第一本书的作者是: " + author);
// 2. 获取所有书的标题
JSONArray titles = JsonPath.parse(complexJson).read("$.store.book[*].title");
System.out.println("所有书的标题: " + titles);
// 3. 获取价格低于10的书
List<String> cheapBooks = JsonPath.parse(complexJson).read("$.store.book[?(@.price < 10)].title");
System.out.println("价格低于10的书: " + cheapBooks);


还没有评论,来说两句吧...