2010-12-31 13 views
19

HTTP POSTを使用してデータを送信するコードのトラブルシューティングを行い、内容が辞書であるJSON結果を返す必要があります。私はこのサービスを公開するためにXML-RPCラッパーを使用しています。私は、次のステートメントを使用してJSONの結果に以下の文字列を変換しようとしているjson.loadsを経由してPythonにJSONを送信する:

{'created': datetime.datetime(2010, 12, 31, 19, 13, 8, 379909), 'worker': u'GoogleWorker', 'ready': False, 'request_id': '8f1381853a444a42a37ae5152a3af947', 'owner': u'admin', 'shortname': u'test19'} 

::ラッパーがHTTP応答変数からの辞書情報を受信すると、辞書の内容は、この形式の文字列である

Fault: <Fault 1: "<type 'exceptions.ValueError'>:Expecting property name: line 1 column 1 (char 1)">

私は手動でJSONに上記の文字列を変換しようとしたが、私は同じことを得る:私はJSONにデータを変換するためにjson.loadsを使用しようとすると、しかし、私は次のエラーを取得する

result = json.loads(response[1]) 

エラー。ディクテーションは何らかの形で不正な形式ですか?それはユニコードに起因するのでしょうか?私もロケールをUTF-8に設定しようとしましたが、失敗しました。

ご協力いただければ幸いです。

+0

ありがとうございました。私は間違った質問をしていることに気付きました。私はdjango-pistonを使用するAPIをデバッグしようとしています。以前は使用していませんでした。私の実際の質問は、django-pistonに関連しています。なぜなら、レスポンスがHTTP CREATED(201)であればいつでも、私のレスポンスのContent-Typeはapplication/jsonではなくtext-plainに設定されていたからです。元の質問は実際の問題とは無関係です(JSONの動作に関する回答は面白いですが!)ので、これを別の質問として尋ねます。 –

答えて

31

あなたは間違った方法を使用しようとしています。 json.loadsです。JSONをPythonにロードしています。 PythonをJSONに変換する場合はjson.dumpsが必要です。

result = json.dumps(response[1]) 
+0

私はこれを実際に考え出していましたが、すべてのコードを詳しく見てから間違った質問をしています。私の質問は、django-pistonに関連しています。なぜなら、応答がHTTP CREATED(201)であればいつでも、私の応答のContent-Typeがapplication/jsonではなくtext-plainに設定されていたからです。私はこれを別の質問として尋ねます。 –

+1

これは私にエラーを返します: "NestedMultiDictはjsonシリアライズ可能ではありません" – zakdances

5

このdictはJSONではなくPythonのdictリテラル形式です。あなたはできる:

import ast 
result = ast.literal_eval(response[1]) 

その形式での応答を読む。 DjangoがまだJSONで応答をデコードしていないことは確かですか?

+2

literal_evalはdatetimeオブジェクトでは機能しません。しかし、他の何かが既にそれを解析しているのは間違いないと思う。 –

1

私はこれを使用すると、Djangoに使用JSONを持っている:

import simplejson as json 
#to encode 
final= {'first':first_data,'second':second_data} 
json.dumps(final) 
#to decode this is the example from python's api 
json.loads('["foo", {"bar":["baz", null, 1.0, 2]}]') 
関連する問題