2012-04-18 19 views
8

Json dizesini Python sözlüğüne dönüştürmek istediğimde sorun yaşıyorum. Ben dizeJson dizgisini sözlüğe nasıl dönüştürür ve anahtarları sırayla nasıl kaydederim?

s={"name":{"Saban:Saulic"},"price":{"koncert:1000"} ....} 

gibi ben sözlüğü gtet ama tuşların sırası (o ..., fiyat adı değildir) dizede gibi aynı değildir

tags=json.loads(s) 

gibi bir şey yazarken var. Json dize sözlük dönüştürmek ve anahtarlarda sipariş kaydetmek nasıl?

+2

Python sözlükleri sen elemanları üzerinde ilerlerken varsa normalde * tuşuna tarafından girişlerini * erişmek çünkü gayet iyi ve hangi sırasız olan

tags=json.loads(s, object_pairs_hook=collections.OrderedDict) 
, sipariş genellikle önemli değil. Btw, 's' bir dize ise ne bir dize ne de sözlük geçerli bir JSON değil. Nesne dizisi gibi farklı bir yapının peşinde olduğunuza benziyor: '[{" name ":" ... "," price ":" ... "}, ...]'. * Neden * için bazı açıklamalar sağlarsanız, sırayla size doğru bir örnek verin ve size daha iyi bir örnek verebiliriz. –

+0

Bir 'dict' içinde gerçekten "anahtarların sırası" diye bir şey yoktur. Onları birer birer üzerinde yineleyebilirsiniz, ancak onları hangi sırayla aldığınızı kontrol edemezsiniz. –

+3

Sanırım [bu önceki] (http: // stackoverflow.com/questions/6921699/can-i-get-json-to-an-orderdict-in-python) soru stackoverflow üzerinde bir cevap sağlar. – Alvin

cevap

21

Python 2.7 yana sözlüğe Bu tür elemanların kampanya siparişini korur collections

den OrderedDict modülü var. Python Dokümanlar

:

json.load(fp[, encoding[, cls[, object_hook[, parse_float[, parse_int[, parse_constant[, object_pairs_hook[, **kw]]]]]]]])

Deserialize fp (a .read() - Bir JSON belgesini içeren dosya benzeri nesnenin desteklenmesi) bir Python nesneye. fp içeriği UTF-8 dışında başka bir ASCII göre kodlama ile kodlanmış ise

(örneğin latin 1), daha sonra uygun bir kodlama adı belirtilmelidir. ASCII tabanlı olmayan kodlamalar (UCS-2 gibi) 'a izin verilmez ve codecs.getreader (kodlama) (fp) veyakodunun sadece bir unicode nesnesine kodu çözülür ve yüklere() aktarılır.

object_hook, herhangi bir nesnenin tam olarak kodu çözülen (bir dict) sonucuyla çağrılacak isteğe bağlı bir işlevdir. Dict yerine object_hook'un dönüş değeri kullanılacaktır. Bu özellik, özel kod çözücüleri uygulamak için kullanılabilir (örn. JSON-RPC sınıf ipucu).

object_pairs_hook, sıralı bir çiftler listesiyle tam olarak kodu çözülen herhangi bir nesnenin sonucuyla çağrılacak isteğe bağlı bir işlevdir. dict yerine object_pairs_hook'un dönüş değeri kullanılacaktır. Bu özellik, anahtar ve değer çiftlerinin kodunun çözülme sırasına göre belgesine dayanan özel kod çözücüleri uygulamak için kullanılabilir (örneğin, koleksiyonları. OrderedDict() ekleme sırasını hatırlayacaktır). object_hook da tanımlanmışsa, object_pairs_hook önceliğe sahiptir.

sana olan parametreyi object_pairs_hook kullanabilirsiniz düşünüyorum collections.OrderedDict()

İlgili konular