2016-01-27 10 views
6

Kiedy używam Pythona moduł requests ten sposób:wnioski moduł powrotny json z elementów nieuporządkowanych

response = requests.get('http://[some_api_url]') print response.json() mam inny json uporządkowaną w przeciwieństwie do oglądania json za pośrednictwem przeglądarki.

Na przykład:
Via response.json() uzyskać:
[{"key2":"value2"},{"key1:"value1"}]

co następuje poprzez przeglądarkę widzę jak miało być: [{"key1:"value1"},{"key2":"value2"}]

EDIT: Przy drukowaniu response.text jego we właściwej kolejności Ale nie json

+0

Czy możesz opublikować adres URL, proszę? – SIslam

+0

Niestety nie, nie jest to publiczny adres URL – JavaSa

+0

Wywołanie zwraca strukturę danych w języku Python, która zawiera słowniki. Słowniki są nieuporządkowane w Pythonie. –

Odpowiedz

15

Możesz użyć object_pairs_hook a rgument modułu json jak zasugerowano w doc:

object_pairs_hook to opcjonalna funkcja, która zostanie wywołana w wyniku dowolnego obiektu dosłownym dekodowane z uporządkowanej listy par. Zwracana wartość object_pairs_hook będzie używana zamiast dyktowania. Ta funkcja może być używana do implementacji niestandardowych dekoderów, które polegają na dekodowaniu pary kluczy i wartości (na przykład collections.OrderedDict() zapamięta kolejność wstawiania). Jeśli zdefiniowano również object_hook, obiekt object_pairs_hook ma pierwszeństwo.

import json 
from collections import OrderedDict 
result = json.loads(request.text, 
        object_pairs_hook=OrderedDict) 

Aby dostać się prostsze, można zobaczyć w implementation of requests że kwargs są przekazywane z metody json do modułu json, stąd ten działa tak samo:

d = response.json(object_pairs_hook=OrderedDict) 

i d będzie OrderedDict z zachowaniem zamówienia response.text.

+4

Sprawdziłem drugie podejście z 'd = response.json (object_pairs_hook = OrderedDict)' i działa świetnie. –

+0

Proszę zmienić object_parir_hook na object_pairs_hook –

+0

Zrobione, dziękuję za uwagę! – stellasia