json - 在shell脚本中解析json数组

标签 json bash shell unix grep

<分区>

我需要从 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,逗号太多了:

{
  "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]}"

关于json - 在shell脚本中解析json数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39227191/

相关文章:

javascript - JSON Firebase URL 到数组

bash - bash 中的另一个分割文件 - 基于 x 列行之间的差异

.net - C# shell 扩展

linux - #!/bm/bash 和 #!/bin/sh 之间的 shell 编程区别

json - 阻止用户对 mongodb 进行 Json 查询

android - 如何从 URL 获取值并在微调器中设置名称并将选择值 ID 发送到 fragment 中的服务器

c# - 为什么使用 Json.NET 时会出现 RuntimeBinderException?

bash - 忽略 bash 变量

bash - 如果文件末尾没有换行符,如何使用 `while read` (Bash) 读取文件的最后一行?

shell - ZSH:从使用相同名称的 zsh 函数调用内置函数