2010-12-31 12 views
19

Mam rozwiązywania problemów niektóre kod, który używa HTTP POST do wysyłania danych i powinien zwrócić wynik JSON, którego zawartość jest słownik. Używam otoki XML-RPC do ujawnienia tej usługi. Kiedy owijka otrzymuje informacje dict od zmiennej odpowiedzi HTTP, zawartość dict są w ciągu w tej formie:Python Dict do JSON przez 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'} 

Próbuję przekonwertować ciąg poniżej w wyniku JSON stosując następujące oświadczenie:

result = json.loads(response[1]) 

jednak, gdy próbuję użyć json.loads do konwersji danych do formatu JSON, otrzymuję następujący błąd: Fault: <Fault 1: "<type 'exceptions.ValueError'>:Expecting property name: line 1 column 1 (char 1)">

ręcznie próbował przekształcić powyższy ciąg JSON, ale mam takie same błąd. Czy dyktatura jest w jakiś sposób zniekształcona? Czy to z powodu unikodu? Próbowałem również ustawić locale na UTF-8, ale to się nie udało.

Każda pomoc zostanie bardzo doceniona.

+0

Dziękuję wszystkim za pomoc. Zdałem sobie sprawę, że zadaję niewłaściwe pytanie, ponieważ próbuję debugować interfejs API wysłany do mnie, który używa django-tłoków i nie używałem go wcześniej. Moje aktualne pytanie jest związane z django-tłokiem i dlaczego typ zawartości mojej odpowiedzi zawsze był ustawiony na tekstowy zamiast z aplikacji/json, gdy odpowiedź jest tworzona przez HTTP (201). Zapytam o to jako osobne pytanie, ponieważ pierwotne pytanie nie ma związku z rzeczywistym problemem (chociaż odpowiedzi na temat zachowania JSON są interesujące!). –

Odpowiedz

31

Próbujesz użyć niewłaściwego sposobu. json.loads jest dla ładowanie JSON do Python. Jeśli chcesz przekonwertować Python na JSON, potrzebujesz json.dumps.

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

Tak naprawdę to rozgryzłem, ale po dokładniejszym obejrzeniu całego kodu zdałem sobie sprawę, że zadaję niewłaściwe pytanie. Moje pytanie jest związane z django-tłokiem i dlaczego typ zawartości mojej odpowiedzi zawsze był ustawiony na tekstowy zamiast z aplikacji/json, gdy odpowiedź jest tworzona przez HTTP (201). Zapytam o to jako osobne pytanie. –

+1

Daje mi to błąd: "NestedMultiDict nie jest serializowany przez jsona" – zakdances

5

Ten dict jest w dosłownym formacie liter Pythona, a nie JSON. Możesz zrobić:

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

, aby przeczytać odpowiedź w tym formacie. Czy jesteś pewien, że Django nie zdekodował już odpowiedzi JSON?

+2

literal_eval nie będzie działać na obiektach datetime. Ale podejrzewam, że masz rację, że coś innego już analizuje. –

1

mam użytkowania json na Django używam to:

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