2010-06-01 60 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