Как разобрать 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