【问题标题】:Trying to get a JSONPath array of all leaves on json object试图获取 json 对象上所有叶子的 JSONPath 数组
【发布时间】:2020-12-24 15:50:55
【问题描述】:

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

对于 NodeJS,我使用 deepdash 的 paths 函数来获取 JSONPath 格式的 JSON 对象中所有叶子的数组。我正在使用这个数组和 RegEx 从任何请求或响应正文中查找我需要处理的匹配路径。到目前为止,我似乎将使用 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】:

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 过滤的方法。

去 SONPath 实现:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-17
    • 2020-04-13
    相关资源
    最近更新 更多