Кодировать JSON в bash скрипт - PullRequest
0 голосов
/ 18 февраля 2020

Я пытаюсь импортировать шаблон на мой Zabbix сервер с Zabbix API, я использовал это:

fileJSON=\""$(cat template_file)"\"

curl  -s -X POST -H 'Content-Type: application/json-rpc' -d '{
    "jsonrpc": "2.0",
    "method": "configuration.import",
    "params": {
        "format": "json",
        "rules": {
            "templates": {
                "createMissing": true,
                "updateExisting": true
            }
        },
        "source": $fileJSON
    },
    "auth": "6a977cd94b26b6156698459ac4d0f769",
    "id": 1
}' 'http://127.0.0.1/zabbix/api_jsonrpc.php' | jq '.'

Вот вывод:

{"jsonrpc":"2.0","error":{"code":-32700,"message":"Parse error","data":"Invalid JSON. An error occurred on the server while parsing the JSON text."},"id":null}

Я просто не Я не вижу никакой ошибки ... Я пытался использовать веб-сайт парсера, но он не видит никакой ошибки. Эта переменная напрямую заполняется методом экспорта Zabbix (в JSON). Вот содержимое файла:

{
  "jsonrpc": "2.0",
  "result": "{\"zabbix_export\":{\"version\":\"4.4\",\"date\":\"2020-02-18T08:47:31Z\",\"groups\":[{\"name\":\"System\"}],\"templates\":[{\"template\":\"Template Systeme\",\"name\":\"Template Systeme\",\"groups\":[{\"name\":\"System\"}],\"discovery_rules\":[{\"name\":\"D\\u00e9couverte des services\",\"key\":\"service.discovery\",\"delay\":\"30s\"}]}]}}",
  "id": 1
}

Я думаю, что ошибка в формате файла JSON, как закодировать эту переменную в формате JSON?

Ответы [ 3 ]

2 голосов
/ 18 февраля 2020

вы отправляете свои JSON, используя одинарные кавычки '{...}', которые не приводят к интерполяции ваших $fileJSON - следовательно, вы получаете эту ошибку.

Вместо этого используйте двойные кавычки:

curl  -s -X POST -H 'Content-Type: application/json-rpc' -d "{
...

тогда вам нужно будет заключить в кавычки внутренние символы вашего JSON.

Существует также более простой способ интерполировать $fileJSON, используйте его так:

curl  -s -X POST -H 'Content-Type: application/json-rpc' -d '{
    "jsonrpc": "2.0",
    "method": "configuration.import",
    "params": {
        "format": "json",
        "rules": {
            "templates": {
                "createMissing": true,
                "updateExisting": true
            }
        },
        "source": '"$fileJSON"'
    },
    "auth": "6a977cd94b26b6156698459ac4d0f769",
    "id": 1
}' ...

этот способ избавит вас от кавычек внутренних кавычек

1 голос
/ 18 февраля 2020

Из документации API :

источник (обязательно) - строка - Сериализованная строка, содержащая данные конфигурации.

Вы можете найти XML пример источника:

"source": "<?xml version=\"1.0\" encoding=\"UTF-8\"?><zabbix_export><version> [cut]

Вы отправляете как source полный вывод configuration.export вызова:

{
  "jsonrpc": "2.0",
  "result": "{\"zabbix_export\":{\"version\":\"4.4\",\"date\":\"2020-02-18T08:47:31Z\",\"groups\":[{\"name\":\"System\"}],\"templates\":[{\"template\":\"Template Systeme\",\"name\":\"Template Systeme\",\"groups\":[{\"name\":\"System\"}],\"discovery_rules\":[{\"name\":\"D\\u00e9couverte des services\",\"key\":\"service.discovery\",\"delay\":\"30s\"}]}]}}",
  "id": 1
}

, в то время как вам нужно отправить только сериализованную строку , которое должно быть значением поля "result" вашего fileJSON:

"source": "{\"zabbix_export\":{\"  [cut]
0 голосов
/ 18 февраля 2020

Судя по выводу template_file, клавиша result - это не JSON, а JSON строка. Вы пробовали без JSON dump этого?

...