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?
Klucze JSON to * zawsze * ciągi. – duffymo
... a JSON używa łańcuchów, ponieważ są one niezależne od rzędu bajtów. – martineau
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