我有一个从 json 字符串读取的嵌套结构,看起来类似于以下内容......
[
{
"id": 1,
"type": "test",
"sub_types": [
{
"id": "a",
"type": "sub-test",
"name": "test1"
},
{
"id": "b",
"name": "test2",
"key_value_pairs": [
{
"key": 0,
"value": "Zero"
},
{
"key": 1,
"value": "One"
}
]
}
]
}
]
我需要提取和旋转数据,准备好插入数据库......
[
(1, "b", 0, "Zero"),
(1, "b", 1, "One")
]
我正在做以下...
data_list = [
(
type['id'],
sub_type['id'],
key_value_pair['key'],
key_value_pair['value']
)
for type in my_parsed_json_array
if 'sub_types' in type
for sub_type in type['sub_types']
if 'key_value_pairs' in sub_type
for key_value_pair in sub_type['key_value_pairs']
]
到现在为止还挺好。
然而,我接下来需要做的是强制执行一些约束。例如...
if type['type'] == 'test': raise ValueError('[test] types can not contain key_value_pairs.')
但我无法理解。而且我不想诉诸循环。到目前为止,我最好的想法是...
def make_row(type, sub_type, key_value_pair):
if type['type'] == 'test': raise ValueError('sub-types of a [test] type can not contain key_value_pairs.')
return (
type['id'],
sub_type['id'],
key_value_pair['key'],
key_value_pair['value']
)
data_list = [
make_row(
type,
sub_type,
key_value_pair
)
for type in my_parsed_json_array
if 'sub_types' in type
for sub_type in type['sub_types']
if 'key_value_pairs' in sub_type
for key_value_pair in sub_type['key_value_pairs']
]
这行得通,但它会检查每一个 key_value_pair,这感觉是多余的。 (每组键值对可能有数千对,只需要检查一次就知道它们都很好。)
此外,还会有其他类似的规则适用于层次结构的不同级别。比如“test”类型只能包含“sub_test”sub_types。
除了上述选项,还有哪些选择?
- 更优雅?
- 更可扩展?
- 性能更高?
- 更“Pythonic”?