JSON в строку в JSON Python - PullRequest
       17

JSON в строку в JSON Python

0 голосов
/ 18 октября 2019

У меня есть рабочий процесс, в котором вывод одного процесса вводится в следующий.

Процесс A выводит JSON.

Входные данные процесса B должны быть JSON.

Однако, поскольку я передаю JSON в качестве аргумента командной строки, он становитсястрока.

Эта команда ниже не находится под моим контролем. Он автоматически генерируется Nextflow, и поэтому мне нужно найти решение (не обязательно JSON), но мне нужно получить доступ к этим значениям (учитывая, что это, по сути, просто строка)

python3.7 typing.py '{'id': '3283', 'code': '1234', 'task': '66128b3b-3440-4f71-9a6b-c788bc9f5d2c'}'

typing.py

def download_this(task_as_string):
    print("Normal")
    print(task_as_string)

    first = json.dumps(task_as_string)
    print("after json.dumps")
    print(first)

    second = json.loads(first)
    print("after json.loads")
    print(second)
    print(type(second))

if __name__ == "__main__":
    download_this(sys.argv[1])

Я думал, что если сделать json.dumps, а затем json.loads, это сработает, но это не сработает.

Выходные данные

Normal
{id: 3283, code: 1234, task: 66128b3b-3440-4f71-9a6b-c788bc9f5d2c}
after json.dumps
"{id: 3283, code: 1234, task: 66128b3b-3440-4f71-9a6b-c788bc9f5d2c}"
after json.loads
{id: 3283, code: 1234, task: 66128b3b-3440-4f71-9a6b-c788bc9f5d2c}
<class 'str'>

И если я делаю print(second["task"]), я получаю строковые индексы должны быть целыми числами

Traceback (most recent call last):
  File "typing.py", line 78, in <module>
    download_this(sys.argv[1])
  File "typing.py", line 55, in download_typed_hla
    print(second["task"])    
TypeError: string indices must be integers

Так что он никогда не преобразовывался в dict впервое место. Любые идеи, как я могу обойти эту проблему?

1 Ответ

3 голосов
/ 18 октября 2019

Пара вещей:

  1. Ваш JSON неправильно отформатирован. Ключи и значения должны быть заключены в двойные кавычки.
  2. Вы передаете строковую версию JSON. Затем вы преобразуете его в строку еще раз, прежде чем пытаться загрузить. Просто загрузите его напрямую.
def download_this(task_as_string):
    print("Normal")
    print(task_as_string)

    second = json.loads(task_as_string)
    print("after json.loads")
    print(second)
    print(type(second))

download_this('{"id": "3283", "code": "1234", "task": "66128b3b-3440-4f71-9a6b-c788bc9f5d2c"}')

Normal
{"id": "3283", "code": "1234", "task": "66128b3b-3440-4f71-9a6b-c788bc9f5d2c"}
after json.loads
{'id': '3283', 'code': '1234', 'task': '66128b3b-3440-4f71-9a6b-c788bc9f5d2c'}
<class 'dict'>

Чтобы обойти проблему ввода, при условии, что вы доверяете вводу Nextflow, чтобы он соответствовал простой словарной структуре, вы можете сделать что-то вроде этого:

d = dict()
for group in task_as_string.replace('{', '').replace('}', '').split(','):
    l = group.split(':')
    d[l[0].strip()] = l[1].strip()

print(d)
print(type(d))
python3 typing.py '{'id': '3283', 'code': '1234', 'task': '66128b3b-3440-4f71-9a6b-c788bc9f5d2c'}'                      [12:03:11]
{'id': '3283', 'code': '1234', 'task': '66128b3b-3440-4f71-9a6b-c788bc9f5d2c'}
<class 'dict'>

Если JSON из Nextflow является более сложным (т. Е. Со вложением и / или списками), то вам придется придумать более подходящий механизм синтаксического анализа.

...