I am using dataclass
to parse (HTTP request/response) JSON objects and today I came across a problem that requires transformation/alias attribute names within my classes.
from dataclasses import dataclass, asdict
from typing import List
import json
@dataclass
class Foo:
foo_name: str # foo_name -> FOO NAME
@dataclass
class Bar:
bar_name: str # bar_name -> barName
@dataclass
class Baz:
baz_name: str # baz_name -> B A Z
baz_foo: List[Foo] # baz_foo -> BAZ FOO
baz_bar: List[Bar] # baz_bar -> BAZ BAR
currently:
# encode
baz_e = Baz("name", [{"foo_name": "one"}, {"foo_name": "two"}], [{"bar_name": "first"}])
json_baz_e = json.dumps(asdict(baz_e))
print(json_baz_e)
# {"baz_name": "name", "baz_foo": [{"foo_name": "one"}, {"foo_name": "two"}], "baz_bar": [{"bar_name": "first"}]}
# decode
json_baz_d = {
"baz_name": "name",
"baz_foo": [{"foo_name": "one"}, {"foo_name": "two"}],
"baz_bar":[{"bar_name": "first"}]
}
baz_d = Baz(**json_baz_d) # back to class instance
print(baz_d)
# Baz(baz_name='name', baz_foo=[{'foo_name': 'one'}, {'foo_name': 'two'}], baz_bar=[{'bar_name': 'first'}])
expected:
# encode
baz_e = Baz("name", [{"FOO NAME": "one"}, {"FOO NAME": "two"}], [{"barName": "first"}])
json_baz_e = json.dumps(asdict(baz_e))
# decode
json_baz_d = {
"B A Z": "name",
"BAZ FOO": [{"FOO NAME": "one"}, {"FOO NAME": "two"}],
"BAZ BAR":[{"barName": "first"}]
}
baz_d = Baz(**json_baz_d) # back to class instance
Is the only solution dataclasses-json, or is there still a possibility without additional libraries?