在将某个端点插入DynamoDB之前,是否有任何方法可以在从某个终结点收到的json中的任何位置(不知道json的结构)填充空字符串?众所周知,浮点数存在问题,您必须将其转换为十进制数,但似乎无法找出一种简单的方法来填充诸如“ full_name”:“”之类的空字符串,并使用“ N / A”之类的值
我正在寻找类似json.loads(json.dumps(data),parse_float = Decimal)的东西,就像parse_float一样,但要查找空字符串。干净且易于使用的东西。我已经看到您可以为此使用自定义的cls类,但是我不太了解如何正确地执行它,尤其是在不知道json的结构(可能会有所不同)的情况下。
JSON示例:
{
"campaign_id": "9c1c6cd7-fd4d-480b-8c80-07091cdd4103",
"creation_date": 1530804132,
"objects": [
{
"id": 12345,
"full_name": ""
},
...
],
...
}
答案 0 :(得分:0)
您可以通过定义_object_hook_传递给json.loads
来实现。
来自docs:
object_hook是一个可选函数,它将被解码的任何对象常量(字典)的结果调用。将使用object_hook的返回值代替dict。
鉴于此命令:
>>> pprint(d)
{'campaign_id': '9c1c6cd7-fd4d-480b-8c80-07091cdd4103',
'creation_date': 1530804132,
'float': 1.2345,
'objects': [{'full_name': '', 'id': 12345}],
'strs': ['', 'abc', {'a': ''}],
'top_str': ''}
这对函数将在json.loads
的结果上递归,并将空字符串的实例更改为'N / A'。
def transform_dict(mapping=None):
if mapping is None:
mapping = {}
for k, v in mapping.items():
if v == '':
mapping[k] = 'N/A'
elif isinstance(v, dict):
mapping[k] = transform_dict(v)
elif isinstance(v, list):
mapping[k] = transform_list(v)
else:
# Make it obvious that we aren't changing other values
pass
return mapping
def transform_list(lst):
for i, x in enumerate(lst):
if x == '':
lst[i] = 'N/A'
elif isinstance(x, dict):
lst[i] = transform_dict(x)
elif isinstance(x, list):
lst[i] = transform_list(x)
else:
# Make it obvious that we aren't changing other values
pass
return lst
>>> res = json.loads(json.dumps(d), parse_float=decimal.Decimal, )
>>> pprint(res)
{'campaign_id': '9c1c6cd7-fd4d-480b-8c80-07091cdd4103',
'creation_date': 1530804132,
'float': Decimal('1.2345'),
'objects': [{'full_name': 'N/A', 'id': 12345}],
'strs': ['N/A', 'abc', {'a': 'N/A'}],
'top_str': 'N/A'}
请注意,此方法取决于输入json是json对象({...}
)。