<p>如果您想让事情变得更简单一点,我建议使用<a href="https://docs.python.org/3/library/dataclasses.html" rel="nofollow noreferrer">data classes</a>对输入数据进行建模。这样做的主要好处是,您可以对属性使用dot<code>.</code>访问,而不需要使用具有动态键的字典。您还可以从类型暗示中获益,因此您的IDE也应该能够更好地帮助您</p>
<p>在本例中,我建议将它与一个JSON序列化库(如<a href="https://dataclass-wizard.readthedocs.io/" rel="nofollow noreferrer">dataclass-wizard</a>)配对,它实际上完美地支持这个用例。从最新版本v0.15.0开始,它还应该支持从序列化/转储过程中排除字段</p>
<p>下面是我放在一起的一个简单示例,它使用了上面所需的键映射:</p>
<pre class="lang-py prettyprint-override"><code>import json
from dataclasses import dataclass, field
# note: for python 3.9+, you can import this from `typing` instead
from typing_extensions import Annotated
from dataclass_wizard import JSONWizard, json_key
@dataclass
class AddressInfo(JSONWizard):
"""
AddressInfo dataclass
"""
city: Annotated[str, json_key('ADDRESS_CITY')]
street: Annotated[str, json_key('ADDRESS_LINE_1')]
state: Annotated[str, json_key('ADDRESS_STATE')]
# pass `dump=False`, so we exclude the field in serialization.
id: Annotated[int, json_key('ID', dump=False)]
# you could also annotate the below like `Union[str, int]`
# if you want to retain it as a string.
zipcode: Annotated[int, json_key('ADDRESS_ZIP')]
# exclude this field from the constructor (and from the
# de-serialization process)
candidates: int = field(default=1, init=False)
</code></pre>
<p>以及上述各项的示例用法:</p>
<pre class="lang-py prettyprint-override"><code>input_obj = [{'ADDRESS_CITY': 'Whittier', 'ADDRESS_LINE_1': '905 Greenleaf Avenue',
'ADDRESS_STATE': 'CA', 'ADDRESS_ZIP': '90402',
'ID': 111},
{'ADDRESS_CITY': 'Cedar Falls', 'ADDRESS_LINE_1': '93323 Maplewood Dr',
'ADDRESS_STATE': 'CA', 'ADDRESS_ZIP': '95014',
'ID': 222}]
addresses = AddressInfo.from_list(input_obj)
print(' Addresses')
for a in addresses:
print(repr(a))
out_list = [a.to_dict() for a in addresses]
print(' To JSON')
print(json.dumps(out_list, indent=2))
# alternatively, with the latest version (0.15.1)
# print(AddressInfo.list_to_json(addresses, indent=2))
</code></pre>
<p>注意:您仍然可以正常访问每个地址的<code>id</code>,即使JSON结果中省略了此字段</p>