Как разобрать json файл с комментариями c-style?
У меня есть json файл, например:
{
"author":"John",
"desc": "If it is important to decode all valid JSON correctly \
and speed isn't as important, you can use the built-in json module, \
orsimplejson. They are basically the same but sometimes simplej \
further along than the version of it that is included with \
distribution."
//"birthday": "nothing" //I comment this line
}
Этот файл автоматически создается другой программой. Как его разобрать с помощью Python?
Ответы
Ответ 1
Я не могу представить, что json файл "автоматически созданный другой программой" будет содержать комментарии внутри. Поскольку JSON спецификация не определяет никаких комментариев вообще, и это по дизайну, так что нет библиотеки JSON будет выводить JSON - файл с комментарием.
Эти комментарии обычно добавляются позже человеком. Не исключение в этом случае. ОП упомянул, что в своем посте: //"birthday": "nothing"//I comment this line
.
Таким образом, реальный вопрос должен состоять в том, как правильно комментировать некоторый контент в файле json, сохраняя его соответствие спецификации и, следовательно, его совместимость с другими библиотеками json?
И ответ таков: переименуйте свое поле в другое имя. Пример:
{
"foo": "content for foo",
"bar": "content for bar"
}
можно изменить на:
{
"foo": "content for foo",
"this_is_bar_but_been_commented_out": "content for bar"
}
В большинстве случаев это будет работать нормально, потому что потребитель, скорее всего, будет игнорировать неожиданные поля (но не всегда, это зависит от реализации вашего потребителя файла json. Итак, YMMV.)
ОБНОВЛЕНИЕ: Видимо, некоторые читатели были недовольны, потому что этот ответ не дает ожидаемого решения. Ну, на самом деле, я дал рабочее решение, неявно ссылаясь на цитату дизайнера JSON:
Дуглас Крокфорд Паблик Апр 30, 2012 Комментарии в формате JSON
Я удалил комментарии из JSON, потому что увидел, что люди используют их для хранения директив синтаксического анализа, что привело бы к разрушению взаимодействия. Я знаю, что отсутствие комментариев делает некоторых людей грустными, но это не должно.
Предположим, вы используете JSON для хранения файлов конфигурации, которые вы хотите аннотировать. Идите вперед и вставьте все комментарии, которые вам нравятся. Затем передайте его через JSMin, прежде чем передать его вашему анализатору JSON.
Так что, да, продолжайте использовать JSMin. Просто имейте в виду, что когда вы идете к "использованию комментариев в JSON", это концептуально неизведанная территория. Нет никакой гарантии, что какие-либо инструменты вы выберете: встроенный [1,2,3,/* a comment */10]
, стиль Python [1, 2, 3] # a comment
(который является комментарием в Python, но не в Javascript), стиль INI [1, 2, 3]; a comment
[1, 2, 3]; a comment
,..., вы поняли идею.
Я бы все-таки предложил НЕ добавлять несовместимые комментарии в JSON.
Ответ 2
Один из способов - преобразовать текст почти JSON в фактический текст JSON, прежде чем передавать его в синтаксический анализатор, например:
input_str = re.sub(r'\\\n', '', input_str)
input_str = re.sub(r'//.*\n', '\n', input_str)
data = json.loads(input_str)
Ответ 3
jsoncomment - это хорошо, но встроенный комментарий не поддерживается.
Проверьте jstyleson, которые поддерживают
- встроенный комментарий
- однострочный комментарий
- многострочный комментарий
- запятая
пример
устанавливать
pip install jstyleson
использование
import jstyleson
result_dict = jstyleson.loads(invalid_json_str) # OK
jstyleson.dumps(result_dict)
Ответ 4
Я лично его не использовал, но jsoncomment пакет python поддерживает разбор файла JSON с комментариями.
Вы используете его вместо парсера JSON следующим образом:
parser = JsonComment(json)
parsed_object = parser.loads(jsonString)
Ответ 5
Как насчет комментариев?
http://commentjson.readthedocs.io/en/latest/
Это может разобрать что-то вроде ниже.
{
"name": "Vaidik Kapoor", # Person name
"location": "Delhi, India", // Person location
# Section contains info about
// person appearance
"appearance": {
"hair_color": "black",
"eyes_color": "black",
"height": "6"
}
}
Вероятно, эластичный поиск, REST API некоторых продуктов не принимает поле комментариев. Поэтому я думаю, что комментарии внутри json необходимы клиенту для поддержки таких шаблонов, как json.
РЕДАКТИРОВАНИЕ
JSMin кажется более распространенным.
https://pypi.python.org/pypi/jsmin
Ответ 6
Для всех тех, кто считает принятый ответ RayLuo более расстраивающим, чем освещающим:
Причина, по которой изобретатель JSON рекомендует
передайте его через JSMin, прежде чем передать его в свой анализатор JSON
При минимизации Javascript комментарии в JSON (подмножестве Javascript) будут удалены. Таким образом, после этого вы можете передать его на обычный анализатор без проблем.
Ответ 7
Если вы похожи на меня, который предпочитает избегать внешних библиотек, эта функция, которую я написал, будет читать json из файла и удалять комментарии типа "//" и "/* */":
def GetJsonFromFile(filePath):
contents = ""
fh = open(filePath)
for line in fh:
cleanedLine = line.split("//", 1)[0]
if len(cleanedLine) > 0 and line.endswith("\n") and "\n" not in cleanedLine:
cleanedLine += "\n"
contents += cleanedLine
fh.close
while "/*" in contents:
preComment, postComment = contents.split("/*", 1)
contents = preComment + postComment.split("*/", 1)[1]
return contents