2015-03-10 2 views
1

Я хочу, чтобы GET некоторые данные json с сервера. Я делаю это, используя:Получение значения JSON от cURL в Linux Bash

UPDATE=$(curl -i -H "Accept: application/json" -H "Content-Type: application/json" --cookie "${COOKIE_NAME}" "${1}/update/${DEVICE_NAME}"); 

До этого сервер аутентифицирован. ${1} является доменом сервера, ${DEVICE_NAME} - это имя устройства, запрашивающего обновление.

Это возвращает JSON следующим образом:

[{ "_id": "54ff35887d8ef574029b9166", "пользователь": "54fe4313883bcec2c0ac0d64", "__ v": 0, "создал": "2015-03- 10T18: 18: 48.023Z "," status ":" available "," pbo_udid ":" lemaker "," installation_script ":" "," description ":" Prints hello world to console "," package_name ":" helloworld_1.0-1.deb», "имя": "Hello World V1"}]

Я хочу прямо сейчас сделать 2 вещи:

  1. Убедитесь, что данные возвращаются (если обновление не доступно, сервер возвращает данные []
  2. Extract, например package_name

Как сделать это в Баш скрипт Linux?

+3

Вы, вероятно, нужно передать значение JSON в CLI для процессора сценария, который может десериализации строку JSON и извлекать данные, которые вы ищете для. (например, PERL, PHP и т. д.). Конечно, в этот момент я, вероятно, просто напишу всю логику для извлечения и извлечения данных на этом языке сценариев. Кроме того, вы, скорее всего, пытаетесь собрать какую-то неудобную комбинацию 'sed',' awk' и т. Д., Чтобы, по сути, построить десериализатор. –

+0

Есть несколько действительно отличных инструментов для разбора JSON от bash; 'jq' является одним из них. –

ответ

2

Предполагая, что нет Вложенного массива:

cat <<EOF | json_reformat | \ 
    sed -rne '/:/[email protected]^\s+"(\w+)":\s+"([^"]+)",[email protected]_\1="\2"@gp' 
[{"_id":"54ff35887d8ef574029b9166","user":"54fe4313883bcec2c0ac0d64","__v":0,"created":"2015-03-10T18:18:48.023Z","status":"available","pbo_udid":"lemaker","installation_script":"","description":"Prints hello world to console","package_name":"helloworld_1.0-1.deb","name":"Hello World V1"}] 
EOF 

возвращает

json__id="54ff35887d8ef574029b9166" 
json_user="54fe4313883bcec2c0ac0d64" 
json_created="2015-03-10T18:18:48.023Z" 
json_status="available" 
json_pbo_udid="lemaker" 
json_description="Prints hello world to console" 
json_package_name="helloworld_1.0-1.deb" 
json_name="Hello World V1" 

Вам нужно json_reformat для этой работы.

EDIT: без json_reformat:

cat <<EOF | \ 
    sed -re '[email protected](\[|\]|\{|\})@@g' -e 's/,/\n/g' | \ 
    sed -re '[email protected]"(\w+)":\s*"?([^"]*)"[email protected]_\1="\2"@g' 
[{"_id":"54ff35887d8ef574029b9166","user":"54fe4313883bcec2c0ac0d64","__v":0,"created":"2015-03-10T18:18:48.023Z","status":"available","pbo_udid":"lemaker","installation_script":"","description":"Prints hello world to console","package_name":"helloworld_1.0-1.deb","name":"Hello World V1"}] 
EOF 

возвращает (обратите внимание на номер версии, который переформатирован в любом случае):

json__id="54ff35887d8ef574029b9166" 
json_user="54fe4313883bcec2c0ac0d64" 
json___v="0" 
json_created="2015-03-10T18:18:48.023Z" 
json_status="available" 
json_pbo_udid="lemaker" 
json_installation_script="" 
json_description="Prints hello world to console" 
json_package_name="helloworld_1.0-1.deb" 
json_name="Hello World V1" 

Теперь вы можете попробовать разбор этого текст с помощью eval или его источника от stdin.

+0

Спасибо. Любой способ использовать его без загрузки 'json_format' ?? Я не хочу устанавливать другие файлы. – Kousha

+0

Возможно, будет улучшен скрипт 'sed'. Что мне нравится в 'json_reformat', это избавляет вас от необходимости проверки и дезинфекции полученных данных. –

+0

См. Отредактированный ответ без 'json_reformat'. –

4

Гораздо более легко и надежно сделано с помощью jq или jsawk:

content=$(curl ...) 
package_name=$(jq -r '.package_name' <<<"$content")