Java中如何通过JSON Path利用name值获取未知ID的JSON标签?
我来帮你搞定这个需求!在Java中用JSON Path通过name字段值获取对应的未知ID标签,最常用的是Jayway JsonPath库,下面给你详细的实现步骤和代码示例:
1. 先引入依赖
首先需要在你的项目中添加Jayway JsonPath的依赖,如果是Maven项目,在pom.xml中加入:
<dependency> <groupId>com.jayway.jsonpath</groupId> <artifactId>json-path</artifactId> <version>2.8.0</version> </dependency>
2. 假设你的JSON结构
根据你的描述,我假设你的JSON数据结构类似这样(外层是对象,键是未知ID,每个ID对应包含name的子对象):
{ "-1": { "name": "other name" }, "9": { "name": "my name" } }
3. 两种实现方式
方式一:结合Java Stream过滤(直观易懂)
把JSON解析为Map后,通过流筛选出name等于"my name"的条目,再获取对应的键(也就是你要的ID"9"):
import com.jayway.jsonpath.JsonPath; import com.jayway.jsonpath.ReadContext; import java.util.Map; import java.util.Optional; public class JsonPathIdLookup { public static void main(String[] args) { String json = "{\n" + " \"-1\": {\n" + " \"name\": \"other name\"\n" + " },\n" + " \"9\": {\n" + " \"name\": \"my name\"\n" + " }\n" + "}"; ReadContext ctx = JsonPath.parse(json); // 解析为Map,过滤出name匹配的条目,取键 Optional<String> targetId = ctx.read("$").<Map<String, Object>>entrySet().stream() .filter(entry -> { String name = JsonPath.read(entry.getValue(), "$.name"); return "my name".equals(name); }) .map(Map.Entry::getKey) .findFirst(); // 输出结果 targetId.ifPresent(id -> System.out.println("找到的ID标签:" + id)); // 输出 "9" } }
方式二:纯JSON Path表达式(简洁高效)
Jayway JsonPath支持key()函数(版本2.4+可用),可以直接通过表达式获取目标ID:
import com.jayway.jsonpath.JsonPath; import com.jayway.jsonpath.ReadContext; public class JsonPathDirectLookup { public static void main(String[] args) { String json = "{\n" + " \"-1\": {\n" + " \"name\": \"other name\"\n" + " },\n" + " \"9\": {\n" + " \"name\": \"my name\"\n" + " }\n" + "}"; ReadContext ctx = JsonPath.parse(json); // 直接用JSON Path表达式获取匹配name的节点的键 String targetId = ctx.read("$..[?(@.name == 'my name')].key()"); System.out.println("找到的ID标签:" + targetId); // 输出 "9" } }
注意事项
- 如果你的JSON结构和我假设的不同(比如ID嵌套在更深的层级),只需要调整JSON Path表达式的路径即可,核心逻辑都是定位到包含目标
name的节点,再获取它的父级键。 - 如果存在多个
name等于"my name"的条目,方式一中的findFirst()会返回第一个匹配的ID,你可以改成collect(Collectors.toList())来获取所有匹配的ID。
内容的提问来源于stack exchange,提问作者Alvaro Gili
相关产品推荐
相关产品推荐

