【问题标题】:how to get values of a nested key from json file in bash using python one-liner?如何使用 python one-liner 从 bash 中的 json 文件中获取嵌套键的值?
【发布时间】:2019-02-06 11:07:11
【问题描述】:

我正在尝试使用 python one-liner 从 bash 中的 json 文件中获取嵌套键的值。下面给出的是我的 json 文件内容。

{
    "conditional_ks": {
     "saturday":["reportdata_by_type"],
     "sunday":["rt_report","metadata"]
    }
}

我希望将所有值 ["reportdata_by_type","rt_report","metadata"] 作为列表。 我确实喜欢,

[root@testnode1 repair]# python -c "import json; print json.load(open('repair.json','r'))[\"conditional_ks\"].values()"

output: [[u'rt_report', u'metadata'], [u'reportdata_by_type']]

但我需要像 ['rt_report','metadata','reportdata_by_type'] 这样的输出

注意:repair.json是json文件名。

一个选项是使用conditional_ks.*[],它应该给出如下输出:

 ["reportdata_by_type", "rt_report", "metadata" ]

但在 bash 中我无法使用它。

谁能解决这个问题,请帮忙。

【问题讨论】:

    标签: python json bash shell parsing


    【解决方案1】:
    python -c "import json; import itertools; print(list(itertools.chain(*(json.load(open(\"repair.json\", 'r'))[\"conditional_ks\"].values()))))"
    

    我已经在我的计算机中测试了代码,它可以正常工作。希望对您有所帮助。

    【讨论】:

      【解决方案2】:

      一如既往,jq 是从命令行处理 json 的首选工具:

      $ jq '.conditional_ks.saturday + .conditional_ks.sunday' repair.json
      [
        "reportdata_by_type",
        "rt_report",
        "metadata"
      ]
      

      编辑:如果您的真实数据包含的字段多于这两个特定字段,并且您想要连接 conditional_ks 字段的所有值,那么:

      $ jq '[ .conditional_ks[] ] | flatten' repair.json
      

      会成功的。

      【讨论】:

        【解决方案3】:

        尝试跟随脚本。 $1 是你的 json 文件,比如

        ./MyScript.sh 'PathToYourJsonFile'
        

        MyScript.sh:

        #!/bin/bash
        
        content=$(cat "$1");
        string="";
        
        echo "[";
        while read line; do
        
          split=$(echo $line | sed -e 's/.*\[\(.*\)\]/\1/' | sed -s 's/",/" /g');
        
          for i in $split; do
            echo "$i,"
          done
        
        done< <(echo -n "$content" | grep "\:\[");
        
        echo "]";
        

        结果:

        [
        "reportdata_by_type",
        "rt_report",
        "metadata",
        ]
        

        【讨论】:

        • 如果输入 json 与 OP 发布的内容有任何差异,例如冒号前后的额外空格,或跨越多行的数组等,这将中断。使用 JSON 感知程序解析 JSON ,而不是正则表达式,出于同样的原因,您不应该使用它们来尝试处理 XML。太脆弱且容易出错。
        【解决方案4】:

        如下所示,我解决了问题:

        python -c "import json; print reduce(lambda x,y: x+y,json.load(open('repair.json','r'))[\"conditional_ks\"].values())"
        

        输出: [u'rt_report', u'metadata', u'reportdata_by_type']

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2020-10-30
          • 1970-01-01
          • 1970-01-01
          • 2016-08-19
          • 2014-07-29
          • 1970-01-01
          • 2021-10-25
          相关资源
          最近更新 更多