2016-08-30 4 views
4

Мне нужно распечатать ключ и значения из строки json. я Allready разобрать простой JSON строкуParse json array в сценарии оболочки

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

i Можно ли получить данные, подобные этому, используя команду grep?

+0

данные недействительны json. Анализатор json сказал бы: 'parse error: ожидаемая другая пара ключ-значение в строке 6, столбец 10' (команда после пары ключ-значение допускается только в том случае, если за ней следует другая пара ключей/значений) – hek2mgl

+0

Поскольку все предлагают вы устанавливаете сторонние программы. Если ваш формат JSON не изменяется, а ваши ключи ограничены, и вам нужно решение * pure Bash + grep *, вы можете [grep Имена и Идентификаторы в 2 массивах bash отдельно] (http: // stackoverflow.com/a/24890830/3828957), а затем [распечатать их рядом] (http://stackoverflow.com/a/16510716/3828957). – makadev

+0

@makadev * Если ваш формат «JSON» не изменяется, а ваши ключи ограничены, и вам нужно чистое решение Bash + grep * ... вы делаете что-то неправильно. – hek2mgl

ответ

6

Во-первых, ваши данные не действительны 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]}" 
+0

можно ли добавить результат в переменные отдельно, используя этот метод? (например: print1 = echo "$ x" | jq -r '.TestNames [] | "\ (. Name), \ (. Id)"'; echo $ print1; –

+0

Вы ищете [* command substitution *] (https://www.gnu.org/software/bash/manual/html_node/Command-Substitution.html)? – hek2mgl

+0

Мне нужно создать хеш-таблицу (key: name, value = Id), используя вывод json parse. нужно имя и идентификатор отдельно. Возможно ли это с помощью этого решения? –

1

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

'.TestNames | . [] 'должен быть просто' TestNames [] '. – hek2mgl

+0

Спасибо, я сначала попробовал '.TestNames. []' И нашел странным, что он не работает. – Aaron

+0

Осторожно! '.TestNames []', а не '.TestNames. []' – hek2mgl