2016-09-22 119 views
0

我有一個使用Falcon框架在Python 3.4中編寫的Web服務。一個特定的方法接受一個json值的文章。我的代碼:Python json.loads()無法解析json字符串

try: 
     raw_json = req.stream.read() 
    except Exception as ex: 
     raise falcon.HTTPError(falcon.HTTP_400, 'Error', ex.message) 
    try: 
     result_json = json.loads(raw_json.decode('utf-8')) 
    except ValueError: 
     raise falcon.HTTPError(falcon.HTTP_400, 
      'Malformed JSON', 'Could not decode the request body. The JSON was incorrect.') 

    clientIp = result_json['c'] 
    wpIp = result_json['w'] 
    lan = result_json['l'] 
    table = int(result_json['t']) 

此代碼是工作的罰款8個月前,但目前引發錯誤:「列表索引必須是整數或片,不海峽。」我認爲Python或Falcon軟件包更新後可能會崩潰。 raw_json.decode('utf-8')的輸出看起來不錯,返回[{「w」:「10.191.0.2」,「c」:「10.191.0.3」,「l」:「255.255。 255.0「,」t「:」4「}]。我認爲json.loads()是我的問題的根源。 len(result_json)返回1,我期望4.是否有一個額外的參數需要json.loads()來幫助它正確解析?或者我完全錯過了其他的東西?

謝謝, 格雷格(P​​ython的小白)

回答

0

返回的結果是[{"w": "10.191.0.2", "c": "10.191.0.3", "l": "255.255.255.0", "t": "4"}] JSON數組,其被解析成Python列表。因此,

result_json['c'] 

產生了上述錯誤。也許在API中發生了變化,它現在返回一個數組,它之前返回了一個json對象。

這應該工作:

clientIp = result_json[0]['c'] 
... 
+0

該訣竅。謝謝。我覺得這很簡單。 –

+0

這也可能意味着在某些情況下有多個結果,所以您可能需要遍歷'result_json'並從每個'dict'中獲取''c''的值。如果您只是在索引0處編制索引,則不會知道是否遺漏了其他可能重要的數據。 – ShadowRanger

+0

好點,雖然我控制傳入的請求,所以我知道它只是一個單一的項目。 –