2012-08-15 112 views
0

獲取從JSON對象這回:Python沒有正確解析JSON。

呼叫在這裏提出:

response = make_request(GET_QUALIFIED_OFFERS_URL, request) 

def make_request(url, json_data): 
    host = url 
    req = urllib2.Request(host, json_data, {'content-type': 'application/json'}) 
    response_stream = urllib2.urlopen(req) 

    return response_stream.read() 

response = {"Violations":[],"Messages":[],"Log":[],"Session":{"SessionId":813982132},"W3iDeviceId":294294043,"IsAfppOfferwallEnabled":true}, skipkeys=True, ensure_ascii=False, sort_keys=True, indent=4} 

print json.dumps((response), sort_keys=True, indent=4) 

得到一個錯誤:

print json.dumps({"Violations":[],"Messages":[],"Log":[],"Session":{"SessionId":813982132},"W3iDeviceId":294294043,"IsAfppOfferwallEnabled":true}, skipkeys=True, ensure_ascii=False, sort_keys=True, indent=4) 
NameError: global name 'true' is not defined 

它看起來像一些JSON是不正確的。我將價值「真實」的引號加以引用,它的工作原理。那麼有什麼辦法可以把所有的價值引用?

這個工程:

response = {"Violations":[],"Messages":[],"Log":[],"Session":{"SessionId":813982132},"W3iDeviceId":294294043,"IsAfppOfferwallEnabled":"true"}, skipkeys=True, ensure_ascii=False, sort_keys=True, indent=4} 

的問題是我有JSON像這樣與各地一樣,虛實與碩大的按鍵沒有引號值的地方 - 值數據集。

我想要做的是把JSon,並使它相當能夠比較它。我正在嘗試編寫一個自動化框架工作來測試Json中返回的內容。理想情況下,我很想創建一個csv輸出。也許每個鍵都有一個列,然後每個值都有一行。任何人都在做這樣的事情?

+0

用True來代替true。 – mvillaress 2012-08-15 21:47:35

回答

7

在Python中,關鍵字是True,而不是true。區分大小寫。通過兩個dumpsloads用法示例的方式:

>>> from json import dumps, loads 
>>> 
>>> d1 = {'key1': 'val1', 'key2': True, 'key3': False} 
>>> s1 = dumps(d1) 
>>> d2 = loads(s1) 
>>> d1 
{'key3': False, 'key2': True, 'key1': 'val1'} 
>>> s1 
'{"key3": false, "key2": true, "key1": "val1"}' 
>>> d2 
{u'key3': False, u'key2': True, u'key1': u'val1'} 
+0

謝謝。這解釋了它。所以這是問題。我無法控制。這是我從JSON對象返回的內容。有沒有辦法解析數據並修復它?再次感謝您的幫助。 – user1601701 2012-08-16 15:49:39

+1

@ user1601701 - 我認爲你誤解了一些東西。你粘貼的東西不能成爲你從JSON對象中得到的東西。如果你有JSON,它應該是一個字符串,'true'將是小寫字母。如果你正在使用python字典,那麼'True'將會是大寫字母。轉儲/加載方法說明了這一點。發佈的代碼完全錯誤。看起來好像有人企圖採用JavaScript代碼並將其直接粘貼到.py文件中。 – 2012-08-16 17:58:08

+0

@ user1601701 - 請查看我所做的修改。它可能會爲你澄清事情。 – 2012-08-16 18:02:02

4

有寫純JSON字符串和轉換Python數據結構成JSON字符串之間的區別。

Python的JSON{En,De}coder執行以下默認翻譯:

JSON   Python 

object   dict 
array   list 
string   unicode 
number (int) int, long 
number (real) float 
true   True 
false   False 
null   None 

所以,當你用Python語言編寫{'foo': True},JSONEncoder寫出{'foo': true}按照JSON標準。

+0

我改變了我的代碼來執行此操作:def make_request(url,json_data): host = url req = urllib2.Request(host,json_data,{'content-type':'application/json'}) response_stream = urllib2 .urlopen(req) #這是試圖獲得JSON格式漂亮---遇到JSON問題 data_obj = json.loads(response_stream.read()) s = json.dumps(data_obj,sort_keys = True,indent = 4) print s return response_stream.read() – user1601701 2012-08-16 20:47:28

+0

謝謝。怎麼樣在python日期時間equival到json。 – 2013-11-28 19:30:26

+0

這個答案非常重要。如果你正在導入數據,並且傳入的字符串是「{」data「:False}」,python的json庫將在'loads'上失敗。如果您發現此錯誤,請首先清理JSON並向JSON提供程序註冊一個錯誤。 – David 2016-10-18 20:08:06