我正在从返回JSON格式的API请求数据,
{
"a":"1",
"b":{
"c":{
"d":"2",
"e":"3"
},
"f":"4"
},
"g":"5",
"h":"6",
"i":"7",
"j":"8",
"k":"9",
"l":"10"
}
不幸的是,这不是我希望看到的理想格式,并且与其他一些端点不一致。我可能希望将其重新格式化为,
{
"a":"1",
"c":{
"d":"2",
"e":"3"
},
"properties": {
"f":"4",
"g":"5",
"h":"6",
"i":"7",
"j":"8",
"k":"9",
"l":"10"
}
}
我可以很容易地重新格式化它,通过创建一个函数,做这样的事情,
def format(data: dict) -> dict:
return {
"a": data["a"],
"c": data["b"]["c"],
"properties": {
"f":data["f"],
"g":data["g"],
"h":data["h"],
"i":data["i"],
"j":data["j"],
"k":data["k"],
"l":data["l"],
}
}
现在,API本身只在用户请求时返回一些属性。因此,用户可能会或可能不会请求上述properties
下的某些字段,甚至这些功能可能会在未来增加或减少。
如果用户没有请求所有的属性,而只是请求一些属性,这会破坏我的代码。作为一种快速解决方案,我更改了上面的每个属性,使其相应设置
"properties": {
"f":data["f"] if "f" in data else None,
"g":data["g"] if "g" in data else None,
"h":data["h"] if "h" in data else None,
"i":data["i"] if "i" in data else None,
"j":data["j"] if "j" in data else None,
"k":data["k"] if "k" in data else None,
"l":data["l"] if "l" in data else None,
}
这个问题和以前一样-这些属性可能会在未来继续增加到可能10到20个,甚至是properties
属性中的40个特征,从而变得重复。作为一个副作用,我必须在创建这个新格式后运行一个循环来删除所有值为None
的键。
理想情况下,如果值存在,我希望key:value
对仅成为properties
的一部分的解决方案,但我无法想到一个简单或理想的python解决方案,将使这看起来像干净的代码。
我认为创建一个具有None
值的内部属性的对象,然后在循环中执行删除操作是"重复的";-我基本上会创建一个字典对象,然后立即删除它的一部分,这对我来说没有意义。这应该在一个步骤中完成,而不是两个不同的代码段。我担心,在未来的开发人员意识到API的本质之前,这对他们来说可能没有明显的意义。
谢谢!
这样做的一个方法是生成字典。无论properties
的个数是多少,我知道什么是永远不会出现的,即a
,b
,c
密钥。
可以写成
`properties`: {
k:v for (k,v) in data.items() if k not in ['a', 'b', 'c']
}
我想这可能有用。