2010-06-01 61 views
0

在我正在运行的单元测试用例中,我在下面的json文本中的第4个json对象上得到了一个KeyError异常,因为负责解码的代码块正在寻找一个对象,那里,但应该是。python simpleJSONDecoder和复杂的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'未知',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异常。

[对不起,前面不必要的长时间后,我希望这将缩小它有点更多]

+1

你能粘贴确切的错误? – 2010-06-01 01:11:41

+0

什么是* self * .json_encode?你写的东西? – 2010-06-01 01:22:00

+0

它有很多信息,但还不够,因为堆栈跟踪看起来不完整 - 并且其中的踪迹暗示了正在进行的_decoding_情况,而不是**编码(正如您原来的Q建议的那样)。也许你错用了一些你自己的模特?无法分辨,因为我们没有看到模型的定义。 – 2010-06-01 02:00:48

回答

1

复制和粘贴你传递什么self.json_encode,并用它作为json.dumps参数(后Python 2.6中的import json),工作得很好。所以看来这个错误可能在你没有向我们展示的json_encode方法中:除了调用json.dumps ...之外还有什么? (或者simplejson.dumps,如果你使用的是Python < 2.6)。

编辑:使用json_encode = json.JSONEncoder().encode(如OP刚刚发布,但目前正使用旧simplejson因为我曾作为一个可能提到的)也能正常工作。作为Q大编辑的一部分发布的不完整堆栈跟踪表明,该错误出现在解码部分,可能是因为滥用某些模型(无法说明,因为我们没有看到模型) - 与OP提到他现在发布了更多信息,但仍然不足以调试问题。

这强烈地表明,OP会尝试并简化问题一次,这个问题会很有价值,直到最后一次增量简化使得该bug消失 - 通常强烈暗示该错误可能是什么,但是甚至如果不是这样,那么发布最小的方法来重现该错误,以及如果进一步删除微小的代码量,该错误将消失的信息可能会帮助像我们这样的“第三方观察者”都协助调试。 SO并不是一个专为集体调试而设计的平台(对于问题和答案更适用,它为设计的是),但我不认为它打破了SO的规则,试图将其用于这个不同的目的。

+0

我刚刚更新了我的问题。格式很糟糕。我会看看我能否解决这个问题。 – MattM 2010-06-01 01:36:27

0

最后2行回溯:

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

你现在的def _make_report_entry(record):

版本的回溯的前几行嘀咕约解码,不编码。

问题的第一个/原始版本有什么问题?

你现在说“因为我的解码函数期望其他对象(例如'type','instance_id'等),所以我得到一个KeyError异常。

因此,也许你的解码功能被递归调用,并通过调用者预计将能够处理任何结构,不仅与“型”等那些

+0

你的观点3和4有点狡猾:dict()内建函数有你想给它的任何关键字参数。 'dict(record ='string')'用键'record'创建一个字典。 – Duncan 2010-06-01 07:37:36

+0

@Duncan:是的,我很傻,当它出来并忘了它时,我并没有对关键=价值噱头留下深刻的印象 – 2010-06-01 09:19:53