代码之家  ›  专栏  ›  技术社区  ›  Vingtoft

如何自动将AWS类型转换为JSON[duplicate]

  •  0
  • Vingtoft  · 技术社区  · 6 年前

    为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"
                            }
                        }
                    }
                    ]
                }   
            }
        }
    }`
    
    0 回复  |  直到 8 年前
        1
  •  12
  •   vekerdyb    7 年前

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

    • 处理小写和大写键

    编辑:修复递归对象错误

        2
  •  8
  •   Stéphane Bruckert jungledev    8 年前

    我在野外什么也找不到。所以,我决定将dynamodb json的PHP实现移植到发布的标准json here . 我在处理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