Python 将DynamoDB低级接口查询结果折叠为其原始json格式

Python 将DynamoDB低级接口查询结果折叠为其原始json格式,python,amazon-dynamodb,boto3,Python,Amazon Dynamodb,Boto3,最近,我不得不从使用高级AWS DynamoDB python boto3 API切换到低级API,以便与AWS DAX缓存引擎进行对话。令人惊讶的是,在使用低级API的过程中,最大的痛苦是它用来表示查询结果的格式。它不仅包含数据,还包含作为dict键放置的数据类型指示符。。。我想出了一个简短的函数来处理这个问题。我想在这里分享一下,也许其他人也有类似的问题,并认为它很有用。另外,我想问你们,你们是否可以提出更好的方法来处理这种转换 def fold(z): """ Fold Dynam

最近,我不得不从使用高级AWS DynamoDB python boto3 API切换到低级API,以便与AWS DAX缓存引擎进行对话。令人惊讶的是,在使用低级API的过程中,最大的痛苦是它用来表示查询结果的格式。它不仅包含数据,还包含作为dict键放置的数据类型指示符。。。我想出了一个简短的函数来处理这个问题。我想在这里分享一下,也许其他人也有类似的问题,并认为它很有用。另外,我想问你们,你们是否可以提出更好的方法来处理这种转换

def fold(z):
    """ Fold DynamoDB low level interface query result into its original json format """

    if type(z) == list:
        return [fold(x[y]) if (y := next(iter(x))) in {"M", "L"} else x[y] for x in z]

    elif type(z) == dict:
        return {x: fold(z[x][y]) if (y := next(iter(z[x]))) in {"M", "L"} else z[x][y] for x in z}
这里是示例输入

{'formats': {'M': {'command_output': {'M': {'show clock': {'S': 'Output...'},
     'show version': {'S': 'Output...'},
     'show ip interfaces brief': {'S': 'Output...'}}}}},
 'device_type': {'M': {'cisco_asa_mc': {'L': [{'S': 'vf1fw1'},
     {'S': 'vf2fw1'},
     {'M': {'t1': {'S': 'to1'}, 't2': {'S': 'to2'}, 't3': {'S': 'to3'}}}]},
   'cisco_switch': {'L': [{'S': 'aklas1'},
     {'S': 'aklds1'},
     {'S': 'ams2as1'},
     {'S': 'asdas1'},
     {'L': [{'S': 'test1'}, {'S': 'test2'}]}]}}},
 'name': {'S': 'labwr1'},
 'type': {'S': 'cisco_router'},
 'timestamp': {'S': '2020-03-07 14:21:11 EDT'}}
和样本输出

{'formats': {'command_output': {'show clock': 'Output...',
   'show version': 'Output...',
   'show ip interfaces brief': 'Output...'}},
 'device_type': {'cisco_asa_mc': ['vf1fw1',
   'vf2fw1',
   {'t1': 'to1', 't2': 'to2', 't3': 'to3'}],
  'cisco_switch': ['aklas1',
   'aklds1',
   'ams2as1',
   'asdas1',
   ['test1', 'test2']]},
 'name': 'labwr1',
 'type': 'cisco_router',
 'timestamp': '2020-03-07 14:21:11 EDT'}

而不是滚动自己的解决方案,考虑使用BOTO3:

从boto3.dynamodb.types导入类型反序列化器
serde=TypeDeserializer()
out={k:serde.deserialize(v)为您的_input.items()中的k,v

在同一个模块中,您还可以找到一个
类型序列化程序

我很清楚,您使用的是实际的DynamoDB DAX客户端吗?