You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 06:59:15