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

时间:2018-07-08 16:54:22

标签: python

在将某个端点插入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": ""
     },
     ...
  ],
  ...
}

1 个答案:

答案 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对象({...})。