2013-04-14 25 views
5

Python nesnelerini json.dumps kullanarak JSON'a serileştirmeye çalışıyorum. dict'u json.dumps kullanarak serileştirirseniz, bir JSON sözlüğü {..}; Bir list veya tuple serileştirirseniz, bir JSON dizisi olur.Mümkünse, Python dict'ı JSON'a nasıl dönüştürülür

Mümkünse, bir Python dict'u JSON list olarak kolayca serileştirmenin herhangi bir yolu olup olmadığını bilmek istiyorum.

{0:'data',1:'data',2:'data} 

yukarıdaki gibi JSON içine tefrika olur: Mümkünse olarak, anahtarlar, örneğin 0'dan başlamalı ve sıralandı eğer Yani '{"0": "data", "1": "data", "2": "data"}', ama tuşları beri ['data','data','data'] olarak tefrika istiyorum 0'dan başlar ve sıralanır.

Bunun için yaptığım mantık şudur: PHP dizilerinde PHP'den seri hale getirilmiş çok sayıda JSON verisi vardır; burada PHP dizilerinde anahtarlar bulunur ve tuşlar yukarıda açıklandığı gibi sıralanırsa, PHP'nin json.encode dizeleri diğer dizilerde kullanılırsa diziler kullanır. bir şekilde, JSON sözlükleri olarak serileştirilir. JSON serileştirmelerimin hem PHP hem de Python kodum için eşleşmesini istiyorum. Maalesef, PHP kodunu değiştirmek benim durumumda bir seçenek değil.

Herhangi bir öneriniz var mı? Bulduğum tek çözüm, her bir python sözlüğünü incelemek ve doğrulamak için kendi işlevimi yazmak ve önce'un json.dumps'dan önce dönüştürülüp dönüştürülmeyeceğini görmek.

DÜZENLEME: Bir list veya dict yanı, bu böyle devam (yuvalama) Ek bunun içinde dicts ve listeleri ve olabilir olabilir seri ediyorum Bu nesne. Bunu yapmak için 'basit' bir yol olup olmadığını merak ediyorum, aksi takdirde kendime özyinelemeli bir çözüm yazabileceğime inanıyorum. Ancak, daha fazla hatayı önlemek için mevcut kodu kullanmak her zaman daha iyidir.

+0

'dict.values ​​() 'py3k içinde çalışacak mı emin değilim. Ayrıca, FWIW, dicts sıralı bir veri türü değildir, bu yüzden seri hale getirilmiş listenin sırası iyi tanımlanır, ancak json.dumps (liste (dict.values ​​())) yapsanız bile "keyfi" olur – mgilson

cevap

3

size özel Encoder ait encode yöntemle içeriden dönüştürücü çağırabilir rağmen ben ... özyineleme olmadan çözümün bilmiyorum, sadece gereksiz karmaşıklığı eklersiniz .

In [1]: import json 

In [2]: d = {"0": "data0", "1": "data1", "2": {"0": "data0", "1": "data1", "2": "data2"}} 

In [3]: def convert(obj): 
    ...:  if isinstance(obj, (list, tuple)): 
    ...:   return [convert(i) for i in obj] 
    ...:  elif isinstance(obj, dict): 
    ...:   _, values = zip(*sorted(obj.items())) 
    ...:   return convert(values) 
    ...:  return obj 

In [4]: json.dumps(convert(d)) 
Out[4]: '["data0", "data1", ["data0", "data1", "data2"]]' 
2

Sen dizilerini bir liste halinde sözlüğü dönüştürmek ve sonra da sözlük öğeler mutlaka onları istediğinizden daha amacıyla dışarı çıkmıyor, bu sıralamayı yapabilseydik: Normalde için json.JSONEncoder alt sınıf olabilir

items = sorted(d.items(), key=lambda item: item[0]) 
values = [item[1] for item in items] 
json_dict = json.dumps(values) 
1

Kendi özel JSON seri hale getiricinizi oluşturun, ancak bu yerleşik nesne türlerini geçersiz kılmanıza izin vermez.

Eğer kendi özel JSON seri hale yaratmak için JSONEncoder.default yöntemini geçersiz gerekir listdict uzatmak veya gerçekleştirilmesini (onu aramak istediğiniz ne olursa olsun ya da) kendi özel dictlist nesne oluşturmak edin.

olursa olsun bir dict kabul eder ve döndüren bir işlev gerekir listeleri ile özel dict örneklerini değiştirmek yinelemeli bir özel JSON seri hale oluşturabilir veya bakılmaksızın ya bir list veya dict uygun.

İşte bir uygulama var:

def convert_to_list(obj): 
    obj_list = [] 
    for i in range(len(obj)): 
     if i not in obj: 
      return obj # Return original dict if not an ordered list 
     obj_list.append(obj[i]) 
    return obj_list 
İlgili konular