2013-01-24 43 views
0

我正在編碼一個40kb的字典和列表詞典到json,然後通過http推送到一個nosql數據庫。這兩個jsonpickle.encode和json.dumps模塊來編碼我的字典的內容,但都導致一個HTTP錯誤。我試着手動CURLing有問題的代碼段的錯誤結果「-bash:語法錯誤附近意外的標記`( 「」python json encode - 缺少(和' - urllib2.open()以HTTP結尾的錯誤400

下面是一些示例代碼:

import urllib2 , jsonpickle 
url = "http://amazonaws.com/server/%s/_create" % item 
data = jsonpickle.encode(some_dict_of_dicts_and_lists) # also tried json.dumps here. 
try: 
    req = urllib2.Request (url , data , { 'Content-Type' : 'application/json' }) 
    f = urllib2.urlopen (req) 
except Exception as e: 
    print "Error: %s" %e 

上述作品進入我的字典裏的某些部分進入我的NoSQL數據庫然而,這當我發送字典的其他部分時,打印「錯誤:HTTP錯誤400:錯誤的請求」。這對我來說意味着某些東西在數據變量/字符串中沒有正確編碼。爲了獲得捲曲對這個問題的反應,我試着捲曲下面的代碼:

item_id = item_dictionary [ 'id' ] 
data = jsonpickle.encode(some_dict_of_dicts_and_lists) # also tried json.dumps here. 

command = 'curl -XPOST "http://amazonaws.com/server/%s/_create" -d '"%s"' % (nsn_id , data) 
os.system(command) 

這將產生錯誤「SH:-c:0行:語法錯誤附近意外的標記'('」

如果我嘗試手動輸入curl命令到命令行,我得到以下一組錯誤:
curl:(6)無法解析主機:材料;節點名或服務器名提供或未知
curl:(6)無法解析主機:項目;節點名稱或服務名稱提供,或未知
捲曲:(6)Coul d不解析主機:of;節點名或服務名提供,或不知道
curl:(3)[globbing] pos中的不匹配的緊支撐/括號146
{「error」:MapperParsingException [解析失敗];嵌套:JsonParseException [在VALUE_STRING \ n個輸入[來源:[B @ 2ff246ab;行:1,柱:6519];」, 「狀態」:400}

所以:
1)是否有更好的方法,使確保json encode進程捕獲使所有的括號和單引號在它們前面用'\'格式化?我應該在所有人身上進行替換嗎?

2)是否有一個很好的方法來找出使用urllib2更詳細的方式導致此錯誤的原因,還是我需要從命令行執行CURL以獲得bash類型錯誤?

+0

你應該嘗試使用內建的'import json; json.dumps'爲此,像[這裏](http://stackoverflow.com/questions/3290522/urllib2-and-json)。但爲什麼你認爲這個問題是json字典的格式?你究竟嘗試了CURLING? –

回答

0

要回答這兩個您的問題:

1)json.dumps - 假設你通過它有效的輸入 - 永遠創造代表有效JSON對象的字符串。如果你通過無效輸入,它會拋出一個異常。 Python的json模塊的使用非常廣泛,如果有一個錯誤可能會導致它無法格式化JSON字典,那麼現在肯定會知道(並修復)這個錯誤。

2)您收到HTTPError是因爲Web服務器正在返回一個頁面,其中HTTP Status Code是400,以響應您的請求。但是,頁面正文中可能還有一些內容,並且urllib2尚未將其拋棄。您可以調用HTTPError的.read()方法來獲取網頁上的任何內容,而不是像您現在這樣查看狀態代碼(有時不足以瞭解您做錯了什麼)。

當吐出一個400 - Bad Request錯誤時,大多數web API都會返回給你一些有用的解釋,比如一條消息告訴你你在請求中遺漏了哪個參數。將print e.read()放在您的例外區塊中可以讓您看到這一點,並可能允許您解決當前的問題。