Java遍历JSON的多种方法详解**
在Java开发中,JSON(JavaScript Object Notation)作为一种轻量级的数据交换格式,被广泛应用于前后端数据交互、配置文件存储等场景,当我们从API获取数据或读取JSON配置文件后,常常需要对其中的数据进行遍历、解析和提取,本文将详细介绍在Java中遍历JSON的几种常用方法,涵盖不同的JSON库及其使用技巧。
JSON库的选择
Java中并没有内置直接操作JSON的类,因此我们需要借助第三方库,目前主流的JSON库有:
- Jackson:功能强大,性能优秀,是Spring Framework默认的JSON处理库。
- Gson:Google开发,API简洁易用,对复杂对象的序列化/反序列化支持良好。
- org.json:轻量级,API简单,适合处理不太复杂的JSON场景。
- Fastjson:阿里巴巴开发,性能极高,但早期版本存在安全漏洞,新版本已修复,但仍需谨慎使用。
选择哪个库取决于项目需求、性能要求以及团队熟悉度,本文将以Jackson和Gson为例进行讲解,并简要提及org.json。
准备工作:添加依赖
在使用这些库之前,需要确保项目中添加了相应的依赖,以Maven为例:
Jackson (核心模块):
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.15.2</version> <!-- 请使用最新版本 -->
</dependency>
Gson:
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.10.1</version> <!-- 请使用最新版本 -->
</dependency>
org.json:
<dependency>
<groupId>org.json</groupId>
<artifactId>json</artifactId>
<version>20231013</version> <!-- 请使用最新版本 -->
</dependency>
遍历JSON的常见场景
遍历JSON通常分为以下几种情况:
- 已知JSON结构,遍历获取特定字段的值:已知JSON中有"name"和"age"字段,直接获取它们。
- JSON结构未知或动态变化,需要遍历所有键值对:遍历一个JSON对象的所有属性和值。
- JSON是数组形式,需要遍历数组中的每个元素:遍历一个包含多个用户对象的JSON数组。
- 嵌套JSON的遍历:JSON对象中嵌套了其他对象或数组,需要逐层遍历。
使用Jackson遍历JSON
Jackson提供了JsonParser和JsonNode等API来处理JSON。
将JSON字符串转换为JsonNode
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
public class JacksonTraversal {
public static void main(String[] args) throws Exception {
String jsonString = "{\"name\":\"张三\",\"age\":30,\"address\":{\"city\":\"北京\",\"district\":\"朝阳区\"},\"hobbies\":[\"读书\",\"旅行\"]}";
ObjectMapper objectMapper = new ObjectMapper();
JsonNode rootNode = objectMapper.readTree(jsonString);
// 1. 遍历已知字段
String name = rootNode.path("name").asText();
int age = rootNode.path("age").asInt();
System.out.println("姓名: " + name);
System.out.println("年龄: " + age);
// 2. 遍历嵌套对象
JsonNode addressNode = rootNode.path("address");
if (addressNode.isObject()) {
String city = addressNode.path("city").asText();
String district = addressNode.path("district").asText();
System.out.println("地址: " + city + " " + district);
}
// 3. 遍历数组
JsonNode hobbiesNode = rootNode.path("hobbies");
if (hobbiesNode.isArray()) {
System.out.print("爱好: ");
for (JsonNode hobby : hobbiesNode) {
System.out.print(hobby.asText() + " ");
}
System.out.println();
}
// 4. 动态遍历JSON对象的所有字段(适用于结构不固定的情况)
System.out.println("\n动态遍历所有字段:");
rootNode.fields().forEachRemaining(entry -> {
String key = entry.getKey();
JsonNode value = entry.getValue();
if (value.isValueNode()) { // 基本类型或字符串
System.out.println(key + ": " + value.asText());
} else if (value.isObject()) {
System.out.println(key + ": {嵌套对象}");
} else if (value.isArray()) {
System.out.println(key + ": [数组]");
}
});
}
}
说明:
objectMapper.readTree(jsonString)将JSON字符串解析为JsonNode树结构。path(String fieldName)方法安全地获取节点,如果节点不存在则返回MissingNode而不是抛出异常。asText(),asInt(),asDouble()等方法将节点转换为对应类型的值。fields()返回一个Iterator<Map.Entry<String, JsonNode>>,可以遍历对象的键值对。isArray()和isObject()用于判断节点类型。
使用Gson遍历JSON
Gson通过JsonElement及其子类JsonObject, JsonArray, JsonPrimitive, JsonNull来表示JSON结构。
import com.google.gson.*;
import java.util.Iterator;
import java.util.Map;
public class GsonTraversal {
public static void main(String[] args) {
String jsonString = "{\"name\":\"李四\",\"age\":25,\"address\":{\"city\":\"上海\",\"district\":\"浦东新区\"},\"hobbies\":[\"音乐\",\"电影\"]}";
JsonParser jsonParser = new JsonParser();
JsonElement jsonElement = jsonParser.parse(jsonString);
if (jsonElement.isJsonObject()) {
JsonObject jsonObject = jsonElement.getAsJsonObject();
// 1. 遍历已知字段
String name = jsonObject.get("name").getAsString();
int age = jsonObject.get("age").getAsInt();
System.out.println("姓名: " + name);
System.out.println("年龄: " + age);
// 2. 遍历嵌套对象
JsonObject addressObject = jsonObject.getAsJsonObject("address");
if (addressObject != null) {
String city = addressObject.get("city").getAsString();
String district = addressObject.get("district").getAsString();
System.out.println("地址: " + city + " " + district);
}
// 3. 遍历数组
JsonArray hobbiesArray = jsonObject.getAsJsonArray("hobbies");
if (hobbiesArray != null) {
System.out.print("爱好: ");
for (JsonElement hobbyElement : hobbiesArray) {
System.out.print(hobbyElement.getAsString() + " ");
}
System.out.println();
}
// 4. 动态遍历JSON对象的所有字段
System.out.println("\n动态遍历所有字段:");
Set<Map.Entry<String, JsonElement>> entries = jsonObject.entrySet();
for (Map.Entry<String, JsonElement> entry : entries) {
String key = entry.getKey();
JsonElement value = entry.getValue();
if (value.isJsonPrimitive()) {
System.out.println(key + ": " + value.getAsString());
} else if (value.isJsonObject()) {
System.out.println(key + ": {嵌套对象}");
} else if (value.isJsonArray()) {
System.out.println(key + ": [数组]");
}
}
}
}
}
说明:
JsonParser.parse()将JSON字符串解析为JsonElement。getAsJsonObject(),getAsJsonArray(),getAsString(),getAsInt()等方法用于获取特定类型的对象或值。isJsonObject(),isJsonArray(),isJsonPrimitive()用于判断元素类型。jsonObject.entrySet()返回一个Set<Map.Entry<String, JsonElement>>,用于遍历对象的键值对。
使用org.json遍历JSON
org.json库提供了JSONObject和JSONArray类来处理JSON。
import org.json.JSONArray;
import org.json.JSONObject;
public OrgJsonTraversal {
public static void main(String[] args) {
String jsonString = "{\"name\":\"王五\",\"age\":28,\"address\":{\"city\":\"广州\",\"district\":\"天河区\"},\"hobbies\":[\"运动\",\"游戏\"]}";
JSONObject jsonObject = new JSONObject(jsonString);
// 1. 遍历已知字段
String name = jsonObject.getString("name");
int age = jsonObject.getInt("age");
System.out.println("姓名: " + name);
System.out.println("年龄: " + age);
// 2. 遍历嵌套对象
JSONObject addressObject = jsonObject.getJSONObject


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