[Json] JSON with Python

JAsmine_log·2024년 10월 20일
0

JSON with Python

(python 3.13.0 기준)

JSON encoder and decoder

Basic python object hierarchies

import json
json.dumps(['foo', {'bar': ('baz', None, 1.0, 2)}])
'["foo", {"bar": ["baz", null, 1.0, 2]}]'
print(json.dumps("\"foo\bar"))
>>"\"foo\bar"

print(json.dumps('\u1234'))
>>"\u1234"

print(json.dumps('\\'))
>>"\\"

print(json.dumps({"c": 0, "b": 0, "a": 0}, sort_keys=True))
>>{"a": 0, "b": 0, "c": 0}

from io import StringIO
io = StringIO()
json.dump(['streaming API'], io)
io.getvalue()
>>'["streaming API"]'

Compact encoding

import json
json.dumps([1, 2, 3, {'4': 5, '6': 7}], separators=(',', ':'))
>>'[1,2,3,{"4":5,"6":7}]'

Printing

import json
print(json.dumps({'6': 7, '4': 5}, sort_keys=True, indent=4))
>>{
    "4": 5,
    "6": 7
}

Specializing JSON object encoding

import json
def custom_json(obj):
    if isinstance(obj, complex):
        return {'__complex__': True, 'real': obj.real, 'imag': obj.imag}
    raise TypeError(f'Cannot serialize object of {type(obj)}')

json.dumps(1 + 2j, default=custom_json)

Decoding JSON

import json
json.loads('["foo", {"bar":["baz", null, 1.0, 2]}]')
>>['foo', {'bar': ['baz', None, 1.0, 2]}]

json.loads('"\\"foo\\bar"')
>>'"foo\x08ar'

from io import StringIO
io = StringIO('["streaming API"]')
json.load(io)
>>['streaming API']

Specializing JSON object decoding:

import json
def as_complex(dct):
    if '__complex__' in dct:
        return complex(dct['real'], dct['imag'])
    return dct

json.loads('{"__complex__": true, "real": 1, "imag": 2}',
    object_hook=as_complex)
>> (1+2j)

import decimal
json.loads('1.1', parse_float=decimal.Decimal)
>>Decimal('1.1')

Extending JSONEncoder:

import json
class ComplexEncoder(json.JSONEncoder):
    def default(self, obj):
        if isinstance(obj, complex):
            return [obj.real, obj.imag]
        # Let the base class default method raise the TypeError
        return super().default(obj)

json.dumps(2 + 1j, cls=ComplexEncoder)
>>'[2.0, 1.0]'
ComplexEncoder().encode(2 + 1j)
>>'[2.0, 1.0]'
list(ComplexEncoder().iterencode(2 + 1j))
>>['[2.0', ', 1.0', ']']

Reference

[1] https://docs.python.org/3/library/json.html#module-json

profile
Everyday Research & Development

0개의 댓글