使用 Batch 和 JQ 解析包含多个字符串化 json 的 JSON

parsing a JSON containing several stringified jsons using Batch and JQ

我正在创建我公司用于跟踪数据的两个网站之间的集成。其中一个站点 (Monday.com) 的 API 返回了一个 json,其中有几个较小的 json 值作为字符串存储在其中。如果不对每个值分别调用 fromjson,我在解析这些值时遇到问题。

我收到的 json 格式如下:

[
  {
    "name": "xxxxxxxxxxx",
    "percentage": "\"80\"",
    "Status": "{\"index\":1,\"post_id\":null,\"changed_at\":\"2019-07-29T14:44:50.305Z\"}",
    "Timeline": "{\"from\":\"2019-07-03\",\"to\":\"2019-07-25\",\"changed_at\":\"2019-07-29T14:55:39.487Z\"}",
    "Interview Done": "{\"date\":\"2019-07-03\",\"changed_at\":\"2019-07-23T19:56:01.004Z\"}",
    "Credentials Done": "{\"date\":\"2019-07-02\",\"changed_at\":\"2019-07-23T19:57:39.021Z\"}",
    "Skills Done": "{\"date\":\"2019-07-24\",\"changed_at\":\"2019-07-23T19:55:10.847Z\"}",
    "orientation Date": "{\"date\":\"2019-07-25\",\"changed_at\":\"2019-07-23T19:55:07.670Z\"}",
    "Hire Date": null
  },
  {
    "name": "yyyyyyyyyyyy",
    "percentage": null,
    "Status": "{\"index\":1,\"post_id\":null,\"changed_at\":\"2019-07-26T22:57:31.250Z\"}",
    "Timeline": "{\"from\":\"2019-07-17\",\"to\":\"2019-07-26\",\"changed_at\":\"2019-07-23T20:13:58.253Z\"}",
    "Interview Done": "{\"date\":\"2019-07-17\",\"changed_at\":\"2019-07-23T20:13:03.218Z\"}",
    "Credentials Done": "{\"date\":\"2019-07-24\",\"changed_at\":\"2019-07-25T16:12:40.484Z\"}",
    "Skills Done": "{\"date\":\"2019-07-17\",\"changed_at\":\"2019-07-23T20:13:29.884Z\"}",
    "orientation Date": "{\"date\":\"2019-07-25\",\"changed_at\":\"2019-07-23T20:11:52.848Z\"}",
    "Hire Date": null
  }
]

有没有办法结合使用 Batch 和 jq,以便将此 JSON 正确格式化为一个大的嵌套 json,而不是包含多个格式化字符串的 json jsons?

我正在努力将 json 作为批处理脚本的一部分进行动态解析,该批处理脚本首先获取 json,然后在将其发布到另一个 API 之前对其进行处理。

我已经使用单一的 jq 命令成功地分别解析了每一件事,例如 myjson.json | jq . | jq .[].Timeline fromjson

您的情况最简单的方法是使用 walk/1:

walk( if type == "string" then fromjson? // . else . end)

更普遍的...

有时只应用 fromjson 一次是不够的。在这种情况下,以下应该足够了,因为它会导致应用上述过程直到静止:

def until_quiescence(f):
  (f as $x | if ($x == .) then . else ($x | until_quiescence(f)) end);

until_quiescence(walk( if type == "string" then fromjson? // . else . end) )

walk/1

如果您的 jq 还没有 walk,只需包含它的 def,您可以很容易地找到它,例如通过谷歌搜索:jq "def walk"