python simpleJSONDecoder и сложная проблема JSON

В единичном тестовом примере, который я запускаю, я получаю исключение KeyError для 4-го json-объекта в json-тексте ниже, потому что часть кода, ответственного за декодирование, ищет объект, которого нет, но должен быть.

Я прошел через под-объекты и обнаружил, что причиной этого является объект «cpuid». Когда я удаляю его и запускаю тест, он работает нормально.

def _make_report_entry (запись):

response = self.app.post( '/machinestats', params=dict(record=self.json_encode([ {"type": "crash", "instance_id": "xxx", "version": "0.2.0", "build_id": "unknown", "crash_text": "Gah!"}, {"type": "machine_info", "machine_info": "I'm awesome.", "version": "0.2.0", "build_id": "unknown", "instance_id": "yyy"}, {"machine_info": "Soup", "crash_text": "boom!", "version": "0.2.0", "build_id": "unknown", "instance_id": "zzz", "type": "crash"}, {"build_id" : "unknown", "cpu_brand" : "intel", "cpu_count" : 4, "cpuid": { "00000000": {"eax" :123,"ebx" :456, "ecx" :789,"edx" :321}, "00000001": {"eax" :123,"ebx" :456, "ecx" :789,"edx" :321}}, "driver_installed" : True, "instance_id" : "yyy", "version" : "0.2.0", "machine_info" : "I'm awesome.", "os_version" : "linux", "physical_memory_mib" : 1024, "product_loaded" : True, "type" : "machine_info", "virtualization_advertised" : True} ]))) 

В тестируемой части кода я использую simplejson.JSONDecoder из django.utils для декодирования JSON. Когда я регистрирую декодированный вывод для вышеупомянутого JSON, который передается моей функции декодирования, я получаю следующее:

root: INFO: {u'instance_id ': u'xxx', u'type ': u'crash', u'crash_text ': u'Gah!', u'version ': u'0.2.0', u ' build_id ': u'unknown'}

root: INFO: {u'build_id ': u'unknown', u'instance_id ': u'yyy', u'version ': u'0.2.0', u'machine_info ': u "Я потрясающе". , u'type ': u'machine_info'}

root: INFO: {u'build_id ': u'unknown', u'machine_info ': u'Soup', u'version ': u'0.2.0', u'instance_id ': u'zzz', u'crash_text ': u'boom!', u'type ': u'crash'}

root: INFO: {u'eax ': 123, u'edx': 321, u'ebx ': 456, u'ecx': 789}

На последнем объекте JSON передается только объект объекта JSON cpuid для моей функции декодирования. Поскольку моя функция декодирования ожидает других объектов (например, «type», «instance_id» и т. Д.), Я получаю исключение KeyError.

[Извините за предыдущий ненужный длинный пост, я надеюсь, что это еще больше сократит его)

2 Solutions collect form web for “python simpleJSONDecoder и сложная проблема JSON”

Копирование и вставка того, что вы передаете self.json_encode , и использование его в качестве аргумента json.dumps (после import json в Python 2.6) работает отлично. Таким образом, кажется, что ошибка может быть в методе json_encode который вы не показываете нам: что еще он делает, помимо просто вызова json.dumps …? (или simplejson.dumps если вы используете Python <2.6, конечно).

Редактирование : с помощью json_encode = json.JSONEncoder().encode поскольку только что опубликованный OP, за исключением того, что используется более старый simplejson как я упомянул как возможность), также отлично работает. Неполная трассировка стека, также размещенная как часть большого редактирования Q, предполагает, что ошибка возникает в части декодирования , возможно, из-за неправильного использования некоторой модели (не могу сказать, поскольку мы не видим модели) – как OP упомянутый он теперь опубликовал намного больше информации, и все же этого недостаточно, чтобы отладить проблему.

Это наводит на мысль о том, что для OP было бы полезно попытаться и упростить проблему немного, пока последнее постепенное упрощение не приведет к исчезновению ошибки, что обычно сильно намекает на то, что может быть ошибкой, но даже если это не так, t, выставляя мельчайший способ воспроизвести ошибку, а также информацию о том, что ошибка исчезнет, ​​если миниатюрный эпсилон кода будет удалена, может помочь «сторонним наблюдателям», как и все мы, помогать в отладке. SO на самом деле не является платформой, предназначенной для коллективной отладки (лучше подходит для вопросов и ответов, для чего она предназначена), но я не думаю, что она нарушает правила SO, чтобы попытаться использовать ее для этой другой цели.

Последние 2 строки в трассировке:

 File "...j_report/src/jreport/machinestats.py", line 77, in _make_report_entry entry_type=record['type'] 

У вас есть def _make_report_entry(record): версии def _make_report_entry(record):

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

Что имеет первая / оригинальная версия проблемы?

Теперь вы говорите: «Поскольку моя функция декодирования ожидает других объектов (например,« type »,« instance_id »и т. Д.), Я получаю исключение KeyError».

Таким образом, возможно, ваша функция декодирования вызывается рекурсивно и ожидается, что вызывающая сторона сможет обрабатывать ЛЮБЫЕ структуры, а не только те, у которых есть «тип» и т. Д.

  • Самый простой способ сериализации простого объекта класса с simplejson?
  • Установка пакетов python на OpenShift
  • простая функция json dumps с unicode
  • У модуля Python JSON нет атрибутов 'dumps'
  • simplejson возвращает значения не в порядке
  • Как обеспечить, чтобы ключи ключа python были строчными?
  • Массив SimpleJSON и NumPy
  • Как сериализовать объекты db.Model для json?
  •  
    Interesting Posts for Van-Lav

    Можно ли получить «импортирующий модуль» в «импортированном модуле» в Python?

    Как использовать str.replace на рисунках на TLE, а затем найти совпадение с TLE?

    Pyspark: несколько условий в том случае, когда предложение

    Существует ли встроенная функция numpy, чтобы отклонять выбросы из списка

    Код Python для создания зашифрованного паролем zip-файла?

    NumPy, измените значения, которые НЕ входят в список индексов

    Почему «if foo:» следует за веткой, даже если функция foo возвращает False?

    Сценарий Threaded Tkinter падает при создании второго виджета Toplevel

    hex string для символа в python

    iterparse не может проанализировать поле, в то время как другие подобные

    Создайте гиперссылку (или кнопку), которая выполняет скрипт python, а затем перенаправляет, когда скрипт завершается

    обработка нескольких запросов параллельно с использованием колбы

    Кастинг строки для объекта 'unit' в Python

    Slice MultiIndex pandas DataFrame по положению

    Python и libxml2: как итерации в узлах xml с помощью XPATH

    Python - лучший язык программирования в мире.