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

问题描述 投票:0回答:1

Go 新手。我的第一个项目是比较 NodeJS 代理和 Go 代理的帐号标记化。我使用 NodeJS 已经有几年了,并且对此感到非常满意。我的代理不会知道来自目标服务器的任何请求或响应的格式。但它确实有来自 Redis/MongoDB 的配置,类似于 JSONPath 表达式。这些配置可以更改目标服务器/路径、查询参数、标头、请求正文和响应正文等内容。

对于 NodeJS,我使用 deepdash 的 paths 函数来获取 JSONPath 格式的 JSON 对象中所有叶子的数组。我使用这个数组和正则表达式来查找我需要从任何请求或响应正文中处理的匹配路径。到目前为止,看起来我将使用 gjson 来满足我的 JSONPath 需求,但它没有我在 deepdash 中使用的路径命令的任何内容。

我需要创建一个递归函数来自己构建这个 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
过滤器(在正则表达式中转换为
response\.results\[.*\]\.acctNum
)来获取我的 acctNum 字段。

从这个过滤后的数组中,我应该能够使用 gjson 获取实际值,对其进行处理,然后设置新值(我在 NodeJS 中使用 lodash)

go jsonpath
1个回答
1
投票

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 SONPath 实现:

© www.soinside.com 2019 - 2024. All rights reserved.