加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

Python Lambda函数解析DynamoDB的JSON格式

发布时间:2020-12-20 12:33:17 所属栏目:Python 来源:网络整理
导读:为dynamodb流调用的 Python Lambda函数具有具有DynamoDB格式的JSON(包含JSON中的数据类型).我想将DynamoDB JSON转换为标准JSON. PHP和nodejs有Marshaler可以做到这一点.如果Python有相似或其他选项,请告诉我. DynamoDB_format = `{"feas": {"M": { "fea": {
为dynamodb流调用的 Python Lambda函数具有具有DynamoDB格式的JSON(包含JSON中的数据类型).我想将DynamoDB JSON转换为标准JSON. PHP和nodejs有Marshaler可以做到这一点.如果Python有相似或其他选项,请告诉我.

DynamoDB_format = `{"feas":
    {"M": {
        "fea": {
            "L": [
                {
                    "M": {
                        "pre": {
                            "N": "1"
                        },"Li": {
                            "N": "1"
                        },"Fa": {
                            "N": "0"
                        },"Mo": {
                            "N": "1"
                        },"Ti": {
                            "S": "20160618184156529"
                        },"Fr": {
                            "N": "4088682"
                        }
                    }
                }
                ]
            }   
        }
    }
}`

解决方法

更新:现在有一个图书馆: https://pypi.org/project/dynamodb-json/

这是indiangolfer’s answer的改进版本.
虽然indiangolfer的解决方案适用于这个问题,但这个改进的版本对于偶然发现这个线程的其他人来说可能更有用.

def unmarshal_dynamodb_json(node):
    data = dict({})
    data['M'] = node
    return _unmarshal_value(data)


def _unmarshal_value(node):
    if type(node) is not dict:
        return node

    for key,value in node.items():
        # S – String - return string
        # N – Number - return int or float (if includes '.')
        # B – Binary - not handled
        # BOOL – Boolean - return Bool
        # NULL – Null - return None
        # M – Map - return a dict
        # L – List - return a list
        # SS – String Set - not handled
        # NN – Number Set - not handled
        # BB – Binary Set - not handled
        key = key.lower()
        if key == 'bool':
            return value
        if key == 'null':
            return None
        if key == 's':
            return value
        if key == 'n':
            if '.' in str(value):
                return float(value)
            return int(value)
        if key in ['m','l']:
            if key == 'm':
                data = {}
                for key1,value1 in value.items():
                    if key1.lower() == 'l':
                        data = [_unmarshal_value(n) for n in value1]
                    else:
                        if type(value1) is not dict:
                            return _unmarshal_value(value)
                        data[key1] = _unmarshal_value(value1)
                return data
            data = []
            for item in value:
                data.append(_unmarshal_value(item))
            return data

它通过以下方式得到改进:

>处理更多data types,包括以前未正确处理的列表
>处理小写和大写键

编辑:修复递归对象错误

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读