Python Lambda函数解析DynamoDB的JSON格式

2024-05-15 00:33:11 发布

您现在位置:Python中文网/ 问答频道 /正文

为dynamodb流调用的Python Lambda函数具有dynamodb格式的JSON(包含JSON格式的数据类型)。我想将DynamoDB JSON转换为标准JSON。PHP和nodejs有封送拆收器可以做到这一点。请让我知道是否有类似的或其他选择的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"
                        }
                    }
                }
                ]
            }   
        }
    }
}`

Tags: lambda函数jsonformat标准格式nodejsdynamodb
2条回答

更新:现在有一个库: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,包括以前未正确处理的列表

  • 处理小写和大写键

编辑:修复递归对象错误

我在野外什么也找不到。因此,我决定将dynamodb json的PHP实现移植到发布的标准jsonhere。我在处理DynamoDB流的python lambda函数中对此进行了测试。如果有更好的办法,请告诉我。

(PS:这不是PHP封送拆收器的完整端口)

问题中的JSON转换为:

{  
   "feas":{  
      "fea":[  
         {  
            "pre":"1",
            "Mo":"1",
            "Ti":"20160618184156529",
            "Fa":"0",
            "Li":"1",
            "Fr":"4088682"
         }
      ]
   }
}

def unmarshalJson(node):
    data = {}
    data["M"] = node
    return unmarshalValue(data, True)


def unmarshalValue(node, mapAsObject):
    for key, value in node.items():
        if(key == "S" or key == "N"):
            return value
        if(key == "M" or key == "L"):
            if(key == "M"):
                if(mapAsObject):
                    data = {}
                    for key1, value1 in value.items():
                        data[key1] = unmarshalValue(value1, mapAsObject)
                    return data
            data = []
            for item in value:
                data.append(unmarshalValue(item, mapAsObject))
            return data

相关问题 更多 >

    热门问题