V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
luckycoding
V2EX  ›  程序员

请问如何在 JsonPath 中再次筛选通过过滤器过滤出来的结果?

  •  
  •   luckycoding · 2022-07-29 18:31:05 +08:00 · 1123 次点击
    这是一个创建于 634 天前的主题,其中的信息可能已经有所发展或是发生改变。

    对于如下 Json ,假设 site 数组下的元素数量足够多(此处限于篇幅,只写部分),需要通过 JsonPath 筛选出 site 里 name 为“菜鸟”的任意一个 id 。

    {
      "data": {
        "site": [
          {
            "id": "2213341",
            "name": "菜鸟"
          },
          {
            "id": "4123124",
            "name": "菜鸟"
          },
          {
            "id": "2123412",
            "name": "菜鸟"
          },
          {
            "id": "1241433",
            "name": "Google"
          }
        ]
      }
    }
    
    

    通过数组过滤器可以获取到所有满足条件的 id ,但好像无法在从中取出一个来了?

    # 筛选出所有 name 为“菜鸟”的 id
    
    $.data.site[?(@.name=="菜鸟")].id
    
    [
      "2213341",
      "4123124",
      "2123412"
    ]
    
    

    在这个基础上尝试了以下用法好像都无法满足,比如:

    $.data.site[?(@.name=="菜鸟")].id[0]              x
    
    $.data.site[?(@.name=="菜鸟")].id.min()           x
    
    # 再加一个过滤器?
    
    $.data.site[?(@.name=="菜鸟") && something].id    x  
    
    

    感觉通过过滤器筛选出来之后,有多个匹配,虽然也用 [] 包裹了所有的结果,但它并不是一个 Json 意义上的数组,所以无法通过数组的方式再次筛选里面的结果?

    求解惑,求解决方案。

    8 条回复    2022-10-19 16:13:14 +08:00
    NickLuan
        1
    NickLuan  
       2022-07-29 18:44:40 +08:00
    代码里选任意一个不行么,JsonPath 不是很熟悉 但感觉这个?name 的匹配和你需要的任意一个是相互矛盾的
    luckycoding
        2
    luckycoding  
    OP
       2022-07-29 18:53:15 +08:00
    @NickLuan 希望仅通过 JsonPath 获取出来,想知道 JsonPath 是否支持这个用法。
    在外部筛选或者使用正则表达式等都是可以的。
    题意应该不会矛盾吧,就是取 site 数组元素中,name 为菜鸟的任意一个 id 值。
    ychost
        3
    ychost  
       2022-07-30 09:59:13 +08:00
    JSONPath 做不到,你需要的可能是 SQL ?,JSONPath 只能 SELECT 无法做 WHERE 筛选,建议使用 Linq 或者 Ginq 之类的
    moen
        4
    moen  
       2022-07-30 11:27:51 +08:00
    基本上认为是不支持的

    最早的 jsonpath 实现( https://goessner.net/articles/JsonPath/index.html#e4 )的作者有提到建议对过滤后的结果再做一次 jsonpath 查询或者使用语言的数组操作。而某个 jsonpath 实现的库对该需求也是个疑难杂症( https://github.com/json-path/JsonPath/issues/272 )。SQL 标准使用的 jsonpath 也没有该需求的解决方案
    kkeep
        5
    kkeep  
       2022-07-30 19:53:19 +08:00
    可以试一下你所在语言有没有 jq 的类似的实现,比如 gojq
    '[.data.site[]|select(.name == “菜鸟")|.id]|min'
    luckycoding
        6
    luckycoding  
    OP
       2022-08-01 10:34:14 +08:00
    @moen 👍
    faketemp
        7
    faketemp  
       2022-10-10 23:13:04 +08:00 via iPhone   ❤️ 1
    @ychost @moen @kkeep @luckycoding

    实测 jsonpath plus 可以实现
    可以在这里测试查看 https://jsonpath.com/

    表达式:$.data.site[?(@.name=="菜鸟" && @property==1)].id
    luckycoding
        8
    luckycoding  
    OP
       2022-10-19 16:13:14 +08:00
    @faketemp 👍
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   3324 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 13:19 · PVG 21:19 · LAX 06:19 · JFK 09:19
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.