足球直播
足球直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
足球直播
足球直播
搜狗输入法
搜狗输入法
快连
快连
快连
快连下载
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
搜狗输入法
搜狗输入法
quickq下载
quickq官网
Java如何获取嵌套JSON中的JSON数据
在Java开发中,处理JSON数据是一项常见任务,尤其是当JSON结构存在嵌套时,如何准确获取内层JSON对象或数组是开发者需要的技能,本文将介绍几种主流方法,帮助你在Java中高效获取嵌套JSON中的JSON数据。
使用Gson库获取嵌套JSON
Gson是Google提供的开源JSON处理库,支持将JSON字符串转换为Java对象(反序列化)以及将Java对象转换为JSON字符串(序列化),对于嵌套JSON,可以通过定义对应的Java类层级结构来直接获取内层JSON对象。
添加依赖
在项目中添加Gson依赖(Maven示例):
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.10.1</version>
</dependency>
定义嵌套Java类
假设有以下嵌套JSON字符串:
{
"name": "张三",
"age": 25,
"address": {
"city": "北京",
"district": "朝阳区",
"street": "建国路88号"
},
"contacts": [
{"type": "phone", "value": "13812345678"},
{"type": "email", "value": "zhangsan@example.com"}
]
}
可以定义对应的Java类:
public class Person {
private String name;
private int age;
private Address address; // 内层JSON对象
private List<Contact> contacts; // 内层JSON数组
// getters和setters
}
public class Address {
private String city;
private String district;
private String street;
// getters和setters
}
public class Contact {
private String type;
private String value;
// getters和setters
}
解析并获取嵌套JSON
import com.google.gson.Gson;
public class GsonExample {
public static void main(String[] args) {
String jsonStr = "{\"name\":\"张三\",\"age\":25,\"address\":{\"city\":\"北京\",\"district\":\"朝阳区\",\"street\":\"建国路88号\"},\"contacts\":[{\"type\":\"phone\",\"value\":\"13812345678\"},{\"type\":\"email\",\"value\":\"zhangsan@example.com\"}]}";
Gson gson = new Gson();
Person person = gson.fromJson(jsonStr, Person.class);
// 获取内层address对象(JSON)
Address address = person.getAddress();
System.out.println("城市: " + address.getCity()); // 输出: 城市: 北京
// 获取内层contacts数组中的JSON对象
List<Contact> contacts = person.getContacts();
Contact firstContact = contacts.get(0);
System.out.println("联系方式: " + firstContact.getType() + " - " + firstContact.getValue()); // 输出: 联系方式: phone - 13812345678
}
}
通过这种方式,Gson会自动将嵌套JSON映射到对应的Java对象,直接通过对象属性即可获取内层数据。
使用Jackson库获取嵌套JSON
Jackson是另一个流行的JSON处理库,功能强大且性能优越,尤其适合处理复杂的JSON结构,其使用方式与Gson类似,但API略有不同。
添加依赖
Maven依赖:
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.15.2</version>
</dependency>
解析并获取嵌套JSON
同样以上面的嵌套JSON为例,使用Jackson解析:
import com.fasterxml.jackson.databind.ObjectMapper;
public class JacksonExample {
public static void main(String[] args) throws Exception {
String jsonStr = "{\"name\":\"张三\",\"age\":25,\"address\":{\"city\":\"北京\",\"district\":\"朝阳区\",\"street\":\"建国路88号\"},\"contacts\":[{\"type\":\"phone\",\"value\":\"13812345678\"},{\"type\":\"email\",\"value\":\"zhangsan@example.com\"}]}";
ObjectMapper objectMapper = new ObjectMapper();
Person person = objectMapper.readValue(jsonStr, Person.class);
// 获取内层address对象
Address address = person.getAddress();
System.out.println("区域: " + address.getDistrict()); // 输出: 区域: 朝阳区
// 获取contacts数组
List<Contact> contacts = person.getContacts();
Contact secondContact = contacts.get(1);
System.out.println("邮箱: " + secondContact.getValue()); // 输出: 邮箱: zhangsan@example.com
}
}
Jackson还支持直接解析为JsonNode(树模型),无需提前定义Java类,适合处理动态或结构不固定的JSON:
import com.fasterxml.jackson.databind.JsonNode;
public class JacksonJsonNodeExample {
public static void main(String[] args) throws Exception {
String jsonStr = "{\"name\":\"张三\",\"address\":{\"city\":\"北京\"}}";
ObjectMapper objectMapper = new ObjectMapper();
JsonNode rootNode = objectMapper.readTree(jsonStr);
// 获取内层address节点(JsonNode对象,即JSON)
JsonNode addressNode = rootNode.get("address");
System.out.println("address JSON: " + addressNode.toString()); // 输出: {"city":"北京"}
// 从addressNode中获取具体字段
String city = addressNode.get("city").asText();
System.out.println("城市: " + city); // 输出: 城市: 北京
}
}
使用org.json库获取嵌套JSON
org.json是轻量级JSON处理库,适合简单场景,无需定义复杂的Java类。
添加依赖
Maven依赖:
<dependency>
<groupId>org.json</groupId>
<artifactId>json</artifactId>
<version>20231013</version>
</dependency>
解析并获取嵌套JSON
import org.json.JSONObject;
public class OrgJsonExample {
public static void main(String[] args) {
String jsonStr = "{\"name\":\"张三\",\"address\":{\"city\":\"北京\",\"street\":\"建国路\"}}";
JSONObject jsonObject = new JSONObject(jsonStr);
// 获取内层address对象(JSONObject)
JSONObject addressObj = jsonObject.getJSONObject("address");
System.out.println("街道: " + addressObj.getString("street")); // 输出: 街道: 建国路
// 如果内层是数组
String jsonArrayStr = "{\"hobbies\":[\"篮球\",\"阅读\"]}";
JSONObject json = new JSONObject(jsonArrayStr);
// 获取数组并遍历
for (Object hobby : json.getJSONArray("hobbies")) {
System.out.println("爱好: " + hobby); // 输出: 爱好: 篮球; 爱好: 阅读
}
}
}
总结与选择
| 方案 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| Gson | 简单易用,自动映射嵌套对象 | 需提前定义Java类 | 结构固定、需要强类型的JSON解析 |
| Jackson | 性能高,支持树模型(JsonNode) | API相对复杂 | 复杂JSON、动态结构、高性能需求 |
| org.json | 轻量级,无需定义Java类 | 功能较弱,不支持复杂映射 | 简单JSON、快速处理 |
推荐选择:
- 如果JSON结构固定且需要类型安全,优先选择Gson或Jackson(推荐Jackson,性能更优)。
- 如果JSON结构动态或无需定义Java类,可选择Jackson的JsonNode或org.json。
通过以上方法,你可以灵活应对Java中嵌套JSON数据的获取需求,提升开发效率。



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