【问题标题】:Parse json array in shell script [duplicate]在shell脚本中解析json数组[重复]
【发布时间】:2017-01-06 17:18:02
【问题描述】:

我需要从 json 字符串中打印键和值。我已经解析了一个简单的 json 字符串

            {
              "Name": "test1",
              "CreateDate": "2016-08-30T10:52:52Z",
              "Id": "testId1",
            }

我的代码是这样的

 q1=$(echo $x | grep -Po '"Name":.*?[^\\]",'| perl -pe 's/"Name": //; s/^"//; s/",$//');

 q2=$(echo $x | grep -Po '"Id":.*?[^\\]",'| perl -pe 's/"Id": //; s/^"//; s/",$//');

    echo $q1 "," $q2;

但此代码不适用于这样的json字符串

x='{    "TestNames":
        [{
        "Name": "test1",
        "CreateDate": "2016-08-30T10:52:52Z",
        "Id": "testId1"
         }, 
         {
        "Name":  "test2",
        "CreateDate": "2016-08-30T10:52:13Z",
        "Id": "testId2"
    }]
}';

我需要这样打印

test1 , testId1
test2 , testId2

是否可以使用 grep 命令获取这样的数据?

【问题讨论】:

  • 数据不是有效的 json。 json 解析器会说:parse error: Expected another key-value pair at line 6, column 10(键值对后面的命令只有在它后面跟着另一个键/值对时才允许)
  • 既然每个人都建议你安装 3rd 方程序。如果你的 JSON 格式没有改变并且你的密钥是有限的,你需要一个 pure Bash+grep 解决方案,你可以@ 987654321@ 然后print them side by side
  • @makadev 如果你的“JSON”格式没有改变并且你的密钥是有限的,你需要一个纯 Bash+grep 解决方案 ...你做错了。
  • @hek2mgl 为什么,因为给出了另一种解决方案?您确实注意到您的“重复”接受的答案建议安装 js/json 解析器,许多其他的也是如此。这在某些环境中可能不是一个选项。如果这是一个好的解决方案,我不会在 cmets 中编写它。此外,没有人注意到 perl 的用法。为什么不使用 perls JSON 模块...
  • 如果您的应用程序需要处理 json,而您的服务器上没有任何东西可以解析 json 并且您无法安装某些东西,那么您做错了。

标签: json bash shell unix grep


【解决方案1】:

首先,你的数据不是有效的json,逗号太多:

{
  "TestNames": [
    {
      "Name": "test1",
      "CreateDate": "2016-08-30T10:52:52Z",
      "Id": "testId1", <--- Remove that!
    },
    {
      "Name": "test2",
      "CreateDate": "2016-08-30T10:52:13Z",
      "Id": "testId2"
    }
  ]
}

一旦你修复了,你可以使用jq在命令行上解析json:

echo "$x" | jq -r '.TestNames[]|"\(.Name) , \(.Id)"'

如果您需要保留输出值。

declare -A map1

while read name id ; do
    echo "$name"
    echo "$id"
    map1[$name]=$id

done < <(echo "$x" | jq -r '.TestNames[]|"\(.Name) \(.Id)"')

echo "count : ${#map1[@]}"
echo "in loop: ${map1[$name]}"

【讨论】:

  • 是否可以使用这种方法将结果单独添加到变量中? (例如: print1= echo "$x" | jq -r '.TestNames[]|"(.Name) , (.Id)"'; echo $print1;
  • 您在搜索command substitution吗?
  • 我需要使用 json 解析输出创建一个哈希表(key:name,value=Id)。因为我需要分别使用 Name 和 Id。这个解决方案可行吗?
  • 我会使用一个while循环,像这样:pastebin.com/SEh22pAH
  • 感谢 hek2mgl,它为我工作。我看起来像这样的解决方案
【解决方案2】:

我建议使用jq,一个命令行JSON 解析器:

$ echo '''{
          "Name": "test1",
          "CreateDate": "2016-08-30T10:52:52Z",
          "Id": "testId1"
        }''' | jq  '.Name + " , " + .Id'

"test1 , testId1"


$ echo '''{    "TestNames":
    [{
    "Name": "test1",
    "CreateDate": "2016-08-30T10:52:52Z",
    "Id": "testId1"
     },
     {
    "Name":  "test2",
    "CreateDate": "2016-08-30T10:52:13Z",
    "Id": "testId2"
}]
}''' | jq '.TestNames[] | .Name + " , " + .Id'

"test1 , testId1"
"test2 , testId2"

【讨论】:

  • .TestNames | .[] 应该只是 TestNames[]
  • 谢谢,我一开始试过.TestNames.[],但奇怪的是它不起作用。
  • 小心! .TestNames[],不是.TestNames.[]
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-04-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-27
  • 2011-02-08
  • 1970-01-01
相关资源
最近更新 更多