本文介绍了在 Java 中从包含 JSON 数组的字符串中提取特定值的三种方法。首先,推荐使用 Jackson 库进行 JSON 解析,展示了如何通过 POJO 类或 JsonNode 来提取数据。其次,提供了一种在必须手动解析的情况下,通过正则表达式捕获 JSON 数组并进行分割的方法,虽然相对复杂,但在特定场景下仍然适用。
当处理 JSON 数据时,强烈推荐使用专门的 JSON 解析库,例如 Jackson 或 Gson。这些库提供了方便的 API,可以轻松地将 JSON 字符串转换为 Java 对象,避免了手动解析的复杂性和潜在错误。
1. 使用 POJO 类
如果 JSON 结构是固定的,可以定义一个对应的 POJO(Plain Old Java Object)类,使用 Jackson 库将其自动反序列化。
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]
}
} 注意事项:
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(n
ode);
values.forEach(System.out::println);
// Output:
// abc123
// def456
// xyz789
}
}
代码解释:
虽然不推荐,但在某些情况下,可能需要手动解析 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
}
}
} 代码解释:
注意事项:
总结:
推荐使用 Jackson 或 Gson 等 JSON 解析库来处理 JSON 数据。如果必须手动解析 JSON,请谨慎使用正则表达式,并进行充分的测试。使用 JSON 解析库可以提高代码的可读性、可维护性和性能。