Проанализируйте простой python JSON вывод через командную строку, используя jq - "не может индексировать строку со строкой" - PullRequest
0 голосов
/ 02 февраля 2020

Я танцевал с этой проблемой в течение нескольких часов, и мне не повезло решить ее, просматривая похожие посты. Надеюсь, это достаточно просто для быстрого исправления.

По сути, у меня есть сценарий python, который извлекает секрет и выдает его как объект json в стандартный вывод. Существует сценарий bash, который вызывает этот сценарий python, извлекает выходные данные из сценария и предназначен для анализа имени пользователя и пароля из вывода json для использования.

Упрощенный код python :

# test.py
payload = response.payload.data.decode('UTF-8').replace('\n', '')
# ^ equates to:
# payload = "{\"username: \"test\", \"password\": \"test\"}"
sys.stdout.write(json.dumps(payload))

Упрощенный bash код:

#!/bin/bash
credentials=$(python test.py)
echo $(credentials)
echo $(credentials) | jq .
echo $(credentials) | jq .username

Вывод:

"{\"username: \"test\", \"password\": \"test\"}"                         # for echo #1
"{\"username: \"test\", \"password\": \"test\"}"                         # for echo #2 with | jq .
jq: error (at <stdin>:1): Cannot index string with string "username"     # for echo #3

Вместо ошибки я ожидаю, что третий вывод будет:

test

ОБНОВЛЕНИЕ

Я смог наконец решить эту проблему, сделав что-то, что кажется немного хакерским. Измененный код bash, исправляющий эту проблему:

#!/bin/bash
credentials=$(python test.py | jq -r .)
echo $(credentials)
echo $(credentials) | jq .
echo $(credentials) | jq .username

Ответы [ 3 ]

0 голосов
/ 02 февраля 2020

Вы также можете использовать fromjson, например:

echo '"{\"username\": \"test\", \"password\": \"test\"}"' | jq 'fromjson'
{
  "username": "test",
  "password": "test"
}
0 голосов
/ 03 февраля 2020

Строка "{\"username\": \"test\", \"password\": \"test\"}" - это просто строка, а не действительный объект json. Вам нужно decode, прежде чем использовать его как json объект:

test.py

import json
payload = "{\"username\": \"test\", \"password\": \"test\"}"
jd = json.loads(payload)
print(json.dumps(jd))

Затем сценарий теста

#!/bin/bash
credentials=$(python test.py)
echo "$credentials"
echo "$credentials" | jq '.'
echo "$credentials" | jq -r '.username'

выдаст

{"username": "test", "password": "test"}
{
  "password": "test",
  "username": "test"
}
test

В качестве примечания: интересно, почему ваша тестовая команда echo $(credentials) не вызывает ошибку credentials: command not found.

0 голосов
/ 02 февраля 2020
>>> payload = "{\"username\": \"test\", \"password\": \"test\"}"
>>> q = json.loads(payload)
>>> q['username']

Вывод: «тест»

...