![](/img/trans.png)
[英]Can't access JSON loaded with json.dumps(json.loads(input))
[英]python json.dumps and json.loads before DynamoDB insertion
有沒有辦法在從某個端點接收到的 json 中的任何位置(不知道 json 的結構)填充空字符串,然后再將其插入 DynamoDB? 眾所周知,浮點數存在問題,您必須將它們轉換為小數,但似乎無法找到一種簡單的方法來填充空字符串,例如“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": ""
},
...
],
...
}
您可以通過定義一個 _object_hook_ 來傳遞給json.loads
來做到這json.loads
。
從文檔:
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 對象 ( {...}
)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.