
本文介绍了在 Java 中从包含 JSON 数组的字符串中提取特定值的三种方法。首先,推荐使用 Jackson 库进行 JSON 解析,展示了如何通过 POJO 类或 JsonNode 来提取数据。其次,提供了一种在必须手动解析的情况下,通过正则表达式捕获 JSON 数组并进行分割的方法,虽然相对复杂,但在特定场景下仍然适用。
使用 Jackson 库解析 JSON
当处理 JSON 数据时,强烈推荐使用专门的 JSON 解析库,例如 Jackson 或 Gson。这些库提供了方便的 API,可以轻松地将 JSON 字符串转换为 Java 对象,避免了手动解析的复杂性和潜在错误。
1. 使用 POJO 类
如果 JSON 结构是固定的,可以定义一个对应的 POJO(Plain Old Java Object)类,使用 Jackson 库将其自动反序列化。
立即学习“Java免费学习笔记(深入)”;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.json.JsonMapper;
import java.io.IOException;
import java.util.List;
public class MyPojo {
private List values;
public List getValues() {
return values;
}
public void setValues(List values) {
this.values = values;
}
public static void main(String[] args) throws IOException {
String jsonStr = "{\"values\": [\"abc123\", \"def456\", \"xyz789\"]}";
ObjectMapper mapper = new JsonMapper();
MyPojo pojo = mapper.readValue(jsonStr, MyPojo.class);
System.out.println(pojo.getValues()); // Output: [abc123, def456, xyz789]
}
} 注意事项:
- 确保 POJO 类的属性名与 JSON 字段名匹配。
- 需要添加 Jackson 库的依赖。
2. 使用 JsonNode
如果 JSON 结构是动态的,或者不想定义 POJO 类,可以使用 JsonNode 来解析 JSON。
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.json.JsonMapper;
import java.io.IOException;
import java.util.List;
public class JsonNodeExample {
public static void main(String[] args) throws IOException {
String jsonStr = "{\"values\": [\"abc123\", \"def456\", \"xyz789\"]}";
ObjectMapper mapper = new JsonMapper();
JsonNode node = mapper.readTree(jsonStr).get("values");
List values = mapper.readerFor(new TypeReference>() {}).readValue(node);
values.forEach(System.out::println);
// Output:
// abc123
// def456
// xyz789
}
}
代码解释:
- mapper.readTree(jsonStr) 将 JSON 字符串解析为 JsonNode 对象。
- .get("values") 获取名为 "values" 的 JSON 数组。
- mapper.readerFor(new TypeReference
- >() {}).readValue(node) 将 JSON 数组转换为 List
。
手动解析 JSON (不推荐)
虽然不推荐,但在某些情况下,可能需要手动解析 JSON。以下提供一种使用正则表达式的方法,仅作为参考。
import java.util.Arrays;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.stream.Collectors;
public class RegexExample {
public static void main(String[] args) {
String jsonStr = "{\"values\": [\"abc123\", \"def456\", \"xyz789\"]}";
Pattern pattern = Pattern.compile("\"values\"\\s*:\\s*\\[(.+?)\\]");
Matcher matcher = pattern.matcher(jsonStr);
if (matcher.find()) {
String arrayContent = matcher.group(1);
List values = Arrays.stream(arrayContent.split(","))
.map(s -> s.replaceAll("\"", "").trim())
.collect(Collectors.toList());
values.forEach(System.out::println);
// Output:
// abc123
// def456
// xyz789
}
}
} 代码解释:
- Pattern.compile("\"values\"\\s*:\\s*\\[(.+?)\\]") 定义了一个正则表达式,用于匹配 "values" 数组。(.+?) 使用非贪婪模式匹配数组的内容。
- matcher.group(1) 获取匹配到的数组内容。
- arrayContent.split(",") 将数组内容按逗号分割成字符串数组。
- map(s -> s.replaceAll("\"", "").trim()) 移除每个字符串中的引号和空格。
注意事项:
- 这种方法依赖于 JSON 字符串的格式,如果格式不规范,可能会出错。
- 正则表达式的性能可能不如 JSON 解析库。
- 务必进行充分的测试,确保正则表达式能够正确处理各种情况。
总结:
推荐使用 Jackson 或 Gson 等 JSON 解析库来处理 JSON 数据。如果必须手动解析 JSON,请谨慎使用正则表达式,并进行充分的测试。使用 JSON 解析库可以提高代码的可读性、可维护性和性能。










