2013-06-14 9 views
24

Zgodnie z this conversion table, int Python są zapisywane jako numery JSON, gdy są serializowane za pomocą modułu JSON - tak jak oczekiwałbym i chciałbym.Dlaczego klucze int Pythona zmieniają się w ciągi znaków podczas korzystania z json.dumps?

Mam słownik z kluczem całkowitą i całkowitą wartość:

>>> d = {1:2} 
>>> type(d.items()[0][0]) 
<type 'int'> 
>>> type(d.items()[0][1]) 
<type 'int'> 

Kiedy używać moduł json do serializacji to na ciąg JSON, wartość jest zapisana jako liczba, ale kluczem jest napisane jako wyrażenie:

>>> json.dumps(d) 
'{"1": 2}' 

to nie jest zachowanie chcę, i wydaje się szczególnie uszkodzony ponieważ łamie json.dumps/json.loads round-wyzwalanie:

>>> d == json.loads(json.dumps(d)) 
False 

Dlaczego tak się dzieje i czy istnieje sposób, w jaki mogę wymusić zapisanie klucza jako liczby?

+4

Klucze JSON to * zawsze * ciągi. – duffymo

+2

... a JSON używa łańcuchów, ponieważ są one niezależne od rzędu bajtów. – martineau

+3

Jeśli JSON nie jest * ściśle * wymagany, możesz użyć YAML zamiast PyYAML: 'd = {1: 2, 3: 4}; importować yaml; yaml.safe_load (yaml.safe_dump (d)) == d' zwraca True. Ogólnie rzecz biorąc, styl "inline" YAML wygląda na bardziej elastyczny json (klucze mogą być liczbami, łańcuchy zwykle nie muszą być cytowane). Używam tutaj 'safe_load', ponieważ normalne' yaml.load' ma funkcje (budowę klas itp.), Które trudno jest poprawnie zabezpieczyć; 'safe_load | dump' ogranicza zestaw obsługiwanych wejść/wyjść do typów pierwotnych (bool, int, float, string, list, set, dict), dzięki czemu można ich bezpiecznie używać na dowolnych wejściach. – kampu

Odpowiedz

31

Prostym powodem jest to, że JSON does not allow integer keys.

object 
    {} 
    { members } 
members 
    pair 
    pair , members 
pair 
    string : value # Keys *must* be strings. 

, jak obejść to ograniczenie - będzie trzeba najpierw upewnić się, że realizacja odbioru może obsłużyć technicznie nieprawidłową JSON. Następnie możesz zastąpić wszystkie cudzysłowy lub użyć niestandardowego serializera.

+1

I w przeciwieństwie do zwykłego javascript. wszystkie klucze powinny być cytowane. –

Powiązane problemy