【问题标题】:extracting json inside json with jq [duplicate]用jq在json中提取json [重复]
【发布时间】:2021-02-15 15:54:14
【问题描述】:

我经常发现自己想用 jq 命令解析 json,但是 json 中的一个值是一个转义的 json 字符串。

例如如果我像这样用 python 生成数据:

import json
inner = {'a': 'b'}
outer = {'x': json.dumps(inner)}
json.dumps(outer)

我明白了:

{"x": "{\"a\": \"b\"}"}

如何使用jq 命令获取"b"

$ echo '{"x": "{\"a\": \"b\"}"}' | jq .x
"{\"a\": \"b\"}"

好的,这是第一步。 但结果不是 json 字典。这是一个需要转义并解析成json的字符串。

jq .x.a 抛出错误:jq: error (at <stdin>:1): Cannot index string with string "a"

有没有我可以添加到jq 的参数来将两个jq 步骤链接在一起? 或者我可以使用其他命令吗?

例如

echo '{"x": "{\"a\": \"b\"}"}' | jq .x | jq --some-argument .a

echo '{"x": "{\"a\": \"b\"}"}' | jq .x | something-else | jq .a

【问题讨论】:

    标签: json escaping jq


    【解决方案1】:

    以下方法可以解决问题:

    echo '{"x": "{\"a\": \"b\"}"}' | jq -r .x | jq .a
    

    这里的-r 步骤确保输出是原始字符串,而不是 JSON 文本。因此:

    "{\"a\": \"b\"}" -> {"a": "b"},
    

    随后可以将此“原始字符串”作为 jq .a 的 JSON 输入,返回 "b"(或与 -r 标志一起使用时的 b)。

    编辑:调用jq 两次并不理想(感谢@peak),之前的命令可以组合在这个oneliner中

    | jq -r '.x|fromjson.a'
    

    【讨论】:

    • 是的,我知道这个解决方案还不理想,今天想看看如何改进它。谢谢!虽然您的解决方案还不能正常工作,但我确信fromstring 会很有用
    • 在 1.6 中我得到了jjq: error: fromstring/0 is not defined at <top-level>, line 1: .x|fromstring.a jq: 1 compile error
    • 你是对的。我的意思是:避免使用fromjson 调用 jq 两次,例如jq -r '.x|fromjson.a'
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-25
    • 2018-09-08
    • 2015-12-22
    相关资源
    最近更新 更多