使用 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"
我正在创建我公司用于跟踪数据的两个网站之间的集成。其中一个站点 (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"