簡體   English   中英

DynamoDB 插入前的 python json.dumps 和 json.loads

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM