it-swarm.com.ru

Разбор массива json в скрипте Shell

мне нужно напечатать ключ и значения из строки 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?

5
Abdul Manaf

Во-первых, ваши данные не верны, 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]}"
8
hek2mgl

Я бы порекомендовал использовать 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"
2
Aaron