LINUX.ORG.RU

Не могу прочитать JSON из командной строки в Python

 , ,


0

3

Написал вот такой примитивный скрипт, который берет строку со стандартного входа и пытается сделать из нее JSON-объект:

#!/usr/bin/python3

import sys
import json

jsonData = sys.argv[1]

print("Получена JSON строка: ", jsonData)

try:

    config = json.load( jsonData )

except (Exception) as error:
    print("Некорректный формат JSON")
    sys.exit(1)

Запускаю его так:
./ourScript.py '{ "varName": "varValue" }'

И мне в ответ:
Получена JSON строка:  { "varName": "varValue" }
Некорректный формат JSON

Что тут такого неправильного?

★★★★★

Ну и не надо использовать try/except, скрывая экепшены с трейсбеком, там была бы настоящая причина указана, а не то что у тебя написано «Некорректный формат JSON»

masa
()
Ответ на: комментарий от gruy

Ты не читаешь документацию.

Чтение документации не гарантирует:

а) ее понимания
б) безошибочного написания кода

Тебе для качественного ответа стоило придумать что-нибудь другое.

Xintrea ★★★★★
() автор топика
Ответ на: комментарий от Xintrea

Чтение документации не гарантирует

Это правда, но если ты написал неработающую херню и сам не понимаешь что написал, то чтение документации - первое что может исправить ситуацию, и первое что могло её предотвратить.

anonymous
()

fixed

#!/usr/bin/python3

import sys
import json

try:
    with open(sys.argv[1]) as fp:
        config = json.load(fp)

except Exception as error:
    print("Некорректный формат JSON")
    sys.exit(1)

Более лучший вариант:

#!/usr/bin/python3

import sys
import json
import argparse

parser = argparse.ArgumentParser()
parser.add_argument('file', type=argparse.FileType())
args = parser.parse_args()

try:
    config = json.load(args.file)

except Exception as error:
    print("Некорректный формат JSON")
    sys.exit(1)

rtxtxtrx ★★
()

Наболтали тут чепухи. Особенно некоторые примеры кода для демонстрации своей крутизны. Ну, объясняю теоретически и практически.

Теоретически.

1)JSON предназначен не для просмотра глазами, а для обмена данными. Поэтому его использование в командной строке нетипично. Чаще используется файл, или программно формируемая строка JSON присоединяется к HTTP запросу. 2) Разрабатывать надо не в текстовом редакторе, а в каком-нибудь IDE,поскольку оно даёт много подсказок: места синтаксических ошибок, подсказки о функциях и их аргументах, есть отладчики, чтобы посмотреть значения переменных в любом месте. Вот и в этом примере подсказки от IDE помогли.

2)Практически .

  • пробелы внутри строки воспринимаются функцией aegv как разделители аргументов. Можно склеить аргументы в программе, но я для простоты убрал пробелы. Перед " пришлось добавить \:

    ‘{\"varName\":\"varValue\"}’

Затем, ’ в начале и конце строки воспринимались как её часть. Тут и была ошибка. Убрал их с помощью removeprefix() и removesuffix().

Затем, вместо load() использовал loads() - IDE подсказало вариант с подходящими аргументами.

3)Неточность:

except (Exception) as error:

error объявляется, но никак не используется. Об этом предупредило IDE. Добавил использование. В конце программы добавил exit(0). Оно необязательно, но раз у вас есть exit(1) , то может код возврата как-то должен использоваться. Вот результат:

#!/usr/bin/python3

import sys
import json
# для теста нужен аргумент: ./ourScript.py '{ "varName": "varValue" }'
jsonData = sys.argv[1]

json_string = jsonData.removeprefix("'").removesuffix("'")
print("Получена JSON строка: ", json_string)

try:
    config = json.loads( json_string )

except (Exception) as error:
    print("Некорректный формат JSON", error.__cause__)
    sys.exit(1)
input("Конец. Нажмите любую клавишу...")
sys.exit(0)
Partisan ★★★★
()
Ответ на: комментарий от Partisan

print(«Некорректный формат JSON», error.__cause__)

В Python атрибут __cause__ в ошибке исключения используется для цепочки исключений, которая помогает понять, какое исключение привело к возникновению другого исключения.

Что у тебя будет выдавать этот код? Вангую что None.

Xintrea ★★★★★
() автор топика