Make the Python json encoder support Python's new dataclasses

前端 未结 6 1329
忘掉有多难
忘掉有多难 2021-02-03 16:59

Starting with Python 3.7, there is something called a dataclass:

from dataclasses import dataclass

@dataclass
class Foo:
    x: str

However, t

6条回答
  •  我在风中等你
    2021-02-03 17:50

    Ways of getting JSONified dataclass instance

    There are couple of options to accomplish that goal, selection of each imply analyze on which approach suits best for your needs:

    Standart library: dataclass.asdict

    import dataclasses
    import json
    
    
    @dataclass.dataclass
    class Foo:
        x: str
    
    foo = Foo(x='1')
    json_foo = json.dumps(dataclasses.asdict(foo)) # '{"x": "1"}'
    

    Picking it back to dataclass instance isn't trivial, so you may want to visit that answer https://stackoverflow.com/a/53498623/2067976

    Marshmallow Dataclass

    from dataclasses import field
    from marshmallow_dataclass import dataclass
    
    
    @dataclass
    class Foo:
        x: int = field(metadata={"required": True})
    
    foo = Foo(x='1') # Foo(x='1')
    json_foo = foo.Schema().dumps(foo) # '{"x": "1"}'
    
    # Back to class instance.
    Foo.Schema().loads(json_foo) # Foo(x=1)
    

    As a bonus for marshmallow_dataclass you may use validation on the field itself, that validation will be used when someone deserialize the object from json using that schema.

    Dataclasses Json

    from dataclasses import dataclass
    from dataclasses_json import dataclass_json
    
    
    @dataclass_json
    @dataclass
    class Foo:
        x: int
    
    foo = Foo(x='1')
    json_foo = foo.to_json() # Foo(x='1')
    # Back to class instance
    Foo.from_json(json_foo) # Foo(x='1')
    

    Also, in addition to that notice that marshmallow dataclass did type conversion for you whereas dataclassses-json(ver.: 0.5.1) ignores that.

    Write Custom Encoder

    Follow accepted miracle2k answer and reuse custom json encoder.

提交回复
热议问题