【问题标题】:Json Object Parsing using shell script使用 shell 脚本解析 Json 对象
【发布时间】:2021-07-10 14:58:43
【问题描述】:

我正在尝试使用 shell 脚本解析下面的 json 对象:

国家.json

 {
        "countries": [
            {"country":"India","city":["India1","India2","India3"]},
            {"country":"USA","city":["USA1","USA2","USA3"]}
           
           ]
    }

我的期望输出应该是这样的:

country:India, city:India1
country:India, city:India2
country:India, city:India3

country:USA, city:USA1
country:USA, city:USA2
country:USA, city:USA3 

我在 shell 脚本中使用 jq 来迭代上面的 json,如下所示:

for k in $(jq '.countries | keys | .[]' country.json); do
    countryObj=$(jq -r ".countries[$k]" country.json);
    countryValue=$(jq -r '.country' <<< "$countryObj");
    city_array=$(jq -r '.city' <<< "$countryObj");
    echo $city_array
done 

由此我能够得到 city_array 即 ["India1","India2","India3"]["USA1","USA2","USA3"] 但我无法获得上述期望的输出

【问题讨论】:

    标签: arrays json bash shell jq


    【解决方案1】:

    这可以完全在jq中完成。

    jq -r '
       .countries |
       map(
          .country as $country |
          .city | map("country: \( $country ), city: \( . )\n") | add
       ) |
       join("\n")
    '
    

    给予:

    country: India, city: India1
    country: India, city: India2
    country: India, city: India3
    
    country: USA, city: USA1
    country: USA, city: USA2
    country: USA, city: USA3
    

    jqplay


    如果你不需要那个空行,那就简单多了。

    jq -r '
       .countries[] |
       .country as $country |
       .city[] |
       "country: \( $country ), city: \( . )"
    '
    

    jqplay

    【讨论】:

      【解决方案2】:

      添加一个循环,为每个$countryObj 迭代$city_array 中的每个city,然后逐行迭代echo 所需的输出。

      for k in $(jq '.countries | keys | .[]' country.json); do
          countryObj=$(jq -r ".countries[$k]" country.json);
          countryValue=$(jq -r '.country' <<< "$countryObj");
          city_array=$(jq -r '.city' <<< "$countryObj");
          
          for city in $city_array; do
              echo "country:$countryValue, city:$city"
          done
      
          echo "" # Blank line between each country
      done
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-04-24
        • 2014-05-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多