Как решить & ldquo; json.decoder.JSONDecodeError & rdquo; в Python БЕЗ редактирования файла JSON? [Дубликат]

Oracle:

select * from (select foo from bar order by foo) where ROWNUM = x
14
задан seaotternerd 2 May 2015 в 05:27
поделиться

5 ответов

Я не могу представить json-файл «auto, созданный другой программой» , содержащий комментарии внутри. Поскольку json spec вообще не содержит комментариев, а это по дизайну , поэтому никакая библиотека json не выводит json-файл с комментарием.

Эти комментарии обычно добавляются позже человеком. Никакого исключения в этом случае. OP упомянул, что в своем посте: //"birthday": "nothing" //I comment this line.

Итак, реальный вопрос должен быть, как правильно комментировать какой-то контент в json-файле, но при этом сохраняя его соответствие спецификации и, следовательно, ее совместимость с другими json libraries?

И ответ: переименуйте свое поле в другое имя. Пример:

{
    "foo": "content for foo",
    "bar": "content for bar"
}

можно изменить на:

{
    "foo": "content for foo",
    "this_is_bar_but_been_commented_out": "content for bar"
}

Это будет работать очень хорошо большую часть времени, потому что потребитель, скорее всего, игнорирует неожиданные поля (но не всегда, это зависит от реализации вашего json-файла. Итак, YMMV.)

UPDATE: По-видимому, некоторые читатели были недовольны, потому что этот ответ не дает ожидаемого «решения». Ну, на самом деле, я дал рабочее решение, неявно связавшись с цитатой JSON дизайнера :

Douglas Crockford Public Apr 30, 2012 Комментарии в JSON

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

Предположим, вы используете JSON для хранения файлов конфигурации, которые вы хотели бы аннотировать. Вперед и вставьте все комментарии, которые вам нравятся. Затем проведите его через JSMin, прежде чем передавать его вашему парсера JSON.

Итак, да, используйте JSMin . Просто имейте в виду, что, когда вы направляетесь к «использованию комментариев в JSON», это концептуально неизведанная территория. Нет никакой гарантии, что какие бы инструменты вы ни выбрали: inline [1,2,3,/* a comment */ 10], стиль Python [1, 2, 3] # a comment (который является комментарием на Python, но не в Javascript), стиль INI [1, 2, 3] ; a comment, ..., вы получаете идею.

Я бы по-прежнему предлагал НЕ добавлять в JSON несовместимые комментарии.

5
ответ дан RayLuo 22 August 2018 в 07:18
поделиться
  • 1
    tsc --init (машинопись) генерирует tsconfig.json с комментариями, которые я считаю. – John 7 May 2017 в 17:27
  • 2
    @John True, но это именно та причина, по которой его вывод не страшный json. Вы бы needs to pipe the file through JSMin before parsing it. (Цитируется из здесь ). – RayLuo 8 May 2017 в 06:45
  • 3
    phpmyadmin JSON exporter добавляет комментарии в форматах /* */ и //. – Lithy 22 May 2017 в 22:58
  • 4
    @Lithy phpmyadmin JSON exporter МОЖЕТ добавлять комментарии в форматах /* */ и // AT ONE POINT, но похоже, что это считается ошибкой, а они изменили это поведение окончательно . В более общем плане могут быть некоторые программы, которые генерируют нестандартный json-выход, но затем требуется дополнительный пост-процесс для преобразования вывода в действительный json (или в этом случае им необходимо исправить программу позже). Эти программы НЕ квалифицируются как свидетельство для поддержки «json может содержать комментарии». Теперь, могу ли я получить ваш ответ на мой ответ? ;-) – RayLuo 23 May 2017 в 19:24
  • 5
    @RayLuo полностью согласен, что они не являются доказательством! Не знаю, для phpmyadmin, я должен обновить. Кроме того, чтобы добавлять комментарии в JSON, я обычно использую пустой ключ: {"": "Some comment"} – Lithy 27 May 2017 в 12:55

jsoncomment хорош, но встроенный комментарий не поддерживается.

Проверьте jstyleson , которые поддерживают

  • встроенный комментарий
  • однострочный комментарий
  • многострочный комментарий
  • конечная запятая.

Пример

Установить

g2]

pip install jstyleson

Использование

import jstyleson
result_dict = jstyleson.loads(invalid_json_str) # OK
jstyleson.dumps(result_dict)
3
ответ дан Jackson Lin 22 August 2018 в 07:18
поделиться

Один из способов - преобразовать текст почти JSON в фактический текст JSON, прежде чем передавать его в парсер, например:

input_str = re.sub(r'\\\n', '', input_str)
input_str = re.sub(r'//.*\n', '\n', input_str)
data = json.loads(input_str)
11
ответ дан Robᵩ 22 August 2018 в 07:18
поделиться

Я лично его не использовал, но пакет python jsoncomment поддерживает разбор файла JSON с комментариями.

Вы используете его вместо парсера JSON следующим образом:

parser = JsonComment(json)
parsed_object = parser.loads(jsonString)
4
ответ дан studgeek 22 August 2018 в 07:18
поделиться
  • 1
    Этот пакет рассылает комментарии только в начале строки. Таким образом, вы не можете выполнить синтаксический анализ [1,2,3,/* a comment */ 10]. – Sergei 26 May 2017 в 12:24

Как насчет commentjson?

http://commentjson.readthedocs.io/en/latest/

Это может разобрать что-то вроде ниже.

{
    "name": "Vaidik Kapoor", # Person's name
    "location": "Delhi, India", // Person's location

    # Section contains info about
    // person's appearance
    "appearance": {
        "hair_color": "black",
        "eyes_color": "black",
        "height": "6"
    }
}

Вероятно, elasticsearch, REST API некоторых продуктов не принимает поле комментариев. Поэтому я думаю, что комментарий внутри json необходим клиенту.


EDITED

jsmin кажется более распространенным.

https: //pypi.python.org/pypi/jsmin

0
ответ дан tabata 22 August 2018 в 07:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: