无需定义Java对象类时提取JSON指定值的最优方法是什么
Java 使用Jackson获取JSON数组中指定字段对应的属性值
实现思路
直接遍历information对应的JSON数组,匹配type字段值为orange的节点,匹配成功后直接提取该节点的url值即可,用Stream流可以写出非常简洁的实现代码。
完整代码示例
import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import java.util.Optional; import java.util.stream.StreamSupport; public class JsonParseDemo { public static void main(String[] args) throws Exception { // 你的JSON字符串 String jsonStr = "{\n" + " \"id\": \"abc\",\n" + " \"title\": \"123.png\",\n" + " \"description\": \"fruits\",\n" + " \"information\": [\n" + " {\"type\": \"apple\", \"url\": \"https://apple.com\"},\n" + " {\"type\": \"orange\", \"url\": \"https://orange.com\"}\n" + " ],\n" + " \"versions\": 0\n" + "}"; ObjectMapper objectMapper = new ObjectMapper(); JsonNode rootNode = objectMapper.readTree(jsonStr); JsonNode infoArray = rootNode.get("information"); // Stream流简洁实现 Optional<String> orangeUrl = StreamSupport.stream(infoArray.spliterator(), false) // 增加字段存在判断,避免空指针 .filter(node -> node.has("type") && node.has("url") && "orange".equals(node.get("type").asText())) .map(node -> node.get("url").asText()) .findFirst(); // 取出结果,不存在时返回默认空串 String result = orangeUrl.orElse(""); System.out.println(result); // 输出 https://orange.com } }
普通循环版本(不使用Stream)
如果不习惯用Stream,也可以用普通for循环实现:
String targetUrl = ""; JsonNode infoArray = rootNode.get("information"); for (JsonNode node : infoArray) { if (node.has("type") && "orange".equals(node.get("type").asText())) { targetUrl = node.has("url") ? node.get("url").asText() : ""; break; // 匹配到就直接跳出,无需遍历剩余元素 } }
注意事项
- 代码里增加了
has("type")、has("url")的判断,可以避免部分节点缺失对应字段时抛出空指针异常,稳定性更好 - 两种实现都是遍历到第一个匹配的节点就停止,性能不会有问题,就算数组长度很大也不会有额外开销
- 你之前用到的
rootNode.at("/information")和代码里的rootNode.get("information")效果完全一致,直接替换即可
内容的提问来源于stack exchange,提问作者Mikasa
相关产品推荐
相关产品推荐

