Go语言 尝试获取json对象上所有叶子的JSONPath数组

mzmfm0qo  于 12个月前  发布在  Go
关注(0)|答案(1)|浏览(146)

Go新手。我的第一个项目是比较NodeJS代理和Go代理的账号令牌化。我已经做了几年的NodeJS,非常熟悉它。我的代理不会知道来自目标服务器的任何请求或响应的格式。但它确实有来自Redis/MongoDB的类似于JSONPath表达式的配置。这些配置可以改变目标服务器/路径、查询参数、头、请求体和响应体。
对于NodeJS,我使用deepdash的paths函数来获取JSON对象中所有叶子的数组,这些叶子的格式为JSONPath。我使用这个数组和RegEx来查找我需要从任何请求或响应体中处理的匹配路径。到目前为止,看起来我将使用gjson来满足我的JSONPath需求,但它没有任何用于我在deepdash中使用的paths命令的内容。
我是否需要创建一个递归函数来自己构建这个JSONPath数组,或者有人知道可以生成类似内容的库吗?
例如:

{
  "response": {
    "results": [
      {
        "acctNum": 1234,
        "someData": "something"
      },
      {
        "acctNum": 5678,
        "someData": "something2"
      }
    ]
  }
}

字符串
我将得到一个数组,格式如下:

[
  "response.results[0].acctNum",
  "response.results[0].someData",
  "response.results[1].acctNum",
  "response.results[1].someData"
]


然后我可以使用我的response.results[*].acctNum过滤器,它在Regex中转换为response\.results\[.*\]\.acctNum,以获得我的acctname字段。
从这个过滤后的数组中,我应该能够使用gjson获取实际值,处理它,然后设置新值(我在NodeJS中使用lodash)

flvlnr44

flvlnr441#

在GoLang中有许多JSONPath实现。在这方面我真的不能给出给予建议。
但是,我认为您需要的只是这个基本路径:$..*
它应该在几乎任何能够返回路径而不是值的实现中返回:

[
   "$['response']",
   "$['response']['results']",
   "$['response']['results'][0]",
   "$['response']['results'][1]",
   "$['response']['results'][0]['acctNum']",
   "$['response']['results'][0]['someData']",
   "$['response']['results'][1]['acctNum']",
   "$['response']['results'][1]['someData']"
]

字符串
如果我理解正确的话,这应该仍然可以使用你的方法使用RegEx过滤。
Go JSONPath实现:

相关问题