2010-12-31 5 views
19

Ich habe einige Codes, die HTTP POST senden, um Daten zu senden, und sollte ein JSON-Ergebnis zurückgeben, deren Inhalt ein Wörterbuch ist. Ich verwende einen XML-RPC-Wrapper, um diesen Dienst verfügbar zu machen. Wenn der Wrapper der dict Informationen aus den HTTP-Antwortvariablen empfängt, sind die dict Inhalte in einer Zeichenkette in dieser Form:Python dict zu JSON über json.loads:

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

Ich versuche, die Zeichenfolge unten in ein JSON Ergebnis mit der folgenden Aussage zu konvertieren:

result = json.loads(response[1]) 

aber wenn ich versuche, json.loads zu verwenden, um die Daten zu JSON zu konvertieren, bekomme ich folgende Fehlermeldung: Fault: <Fault 1: "<type 'exceptions.ValueError'>:Expecting property name: line 1 column 1 (char 1)">

ich habe versucht, manuell die obige Zeichenfolge zu JSON zu konvertieren, aber ich bekomme die gleiche Error. Ist das Diktat in irgendeiner Weise falsch? Liegt es an Unicode? Ich habe auch versucht, das Gebietsschema auf UTF-8 zu setzen, aber das war nicht erfolgreich.

Jede Hilfe würde sehr geschätzt werden.

+0

Vielen Dank für Ihre Hilfe. Mir wurde klar, dass ich die falsche Frage stelle, da ich versuche, eine API zu debuggen, die mit Django-Kolben verwendet wird, und ich habe sie vorher nicht verwendet. Meine eigentliche Frage bezieht sich auf django-kolben und warum der Inhaltstyp meiner Antwort immer auf text-plain anstatt auf application/json gesetzt wurde, wenn die Antwort HTTP CREATED (201) lautet. Ich werde das als eine separate Frage stellen, da die ursprüngliche Frage für das eigentliche Problem irrelevant ist (obwohl die Antworten auf das Verhalten von JSON interessant sind!). –

Antwort

31

Sie versuchen die falsche Methode zu verwenden. json.loads ist für geladen JSON zu Python. Wenn Sie Python in JSON konvertieren möchten, benötigen Sie .

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

Ich hatte das vorher schon herausgefunden, aber nachdem ich meinen gesamten Code genauer betrachtet hatte, wurde mir klar, dass ich die falsche Frage stelle. Meine Frage bezieht sich auf django-kolben und warum der Inhaltstyp meiner Antwort immer auf text-plain anstatt auf application/json gesetzt wurde, wenn die Antwort HTTP CREATED (201) ist. Ich werde das als eine separate Frage stellen. –

+1

Das gibt mir einen Fehler: "NestedMultiDict ist nicht Json serializable" – zakdances

5

Dieses Diktat ist im Python-Format, nicht im JSON-Format. Sie können Folgendes tun:

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

, um die Antwort in diesem Format einzulesen. Bist du sicher, dass Django die Antwort noch nicht JSON-decodiert hat?

+2

Literal_eval funktioniert nicht bei Datetime-Objekten. Aber ich vermute, du hast Recht, dass etwas anderes es bereits analysiert. –

1

ich habe Verwendung json auf django, ich benutze diese:

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]}]') 
Verwandte Themen