首页 文章

在AWS Lambda中将DynamoDB数据格式化为普通JSON

提问于
浏览
25

我正在使用 AWS Lambda 来扫描 DynamoDB 表中的数据 . 这是我得到的回报:

{
  "videos": [
    {
      "file": {
        "S": "file1.mp4"
      },
      "id": {
        "S": "1"
      },
      "canvas": {
        "S": "This is Canvas1"
      }
    },
    {
      "file": {
        "S": "main.mp4"
      },
      "id": {
        "S": "0"
      },
      "canvas": {
        "S": "this is a canvas"
      }
    }
  ]
}

我的前端应用程序正在使用 Ember Data Rest Adapter ,它不接受此类响应 . 有什么方法可以获得正常的JSON格式吗?有一个名为 dynamodb-marshaler 的NPM模块将DynamoDB数据转换为普通JSON . 如果可能的话,我正在寻找 native solution .

6 回答

  • 11

    AWS JavaScript SDK最近使用Document Client进行了更新,它完全满足您的需求 . 查看此处的公告和用法示例:http://blogs.aws.amazon.com/javascript/post/Tx1OVH5LUZAFC6T/Announcing-the-Amazon-DynamoDB-Document-Client-in-the-AWS-SDK-for-JavaScript

  • 19

    我知道有点旧但我在节点js lambda函数中处理来自dynamoDB的流数据有同样的问题 . 我使用了@churro提出的建议

    导入sdk和输出转换器

    var AWS = require("aws-sdk");
    var parse = AWS.DynamoDB.Converter.output;
    

    使用小解释的解析功能

    exports.handler = function( event, context, callback ) {
      var docClient = new AWS.DynamoDB.DocumentClient();
      event.Records.forEach((record) => {
            console.log(record.eventID);
            console.log(record.eventName);
            console.log('DynamoDB Record:', parse({ "M": record.dynamodb.NewImage }));
        });
      callback(null, `Successfully processed ${event.Records.length} records.`);
    }
    

    希望能帮助到你

  • -1

    实际上你应该使用AWSJavaScriptSDK中的 unmarshall 函数:

    const AWS = require("aws-sdk");
    
    exports.handler = function( event, context, callback ) {
      const newImages = event.Records.map(
            (record) => AWS.DynamoDB.Converter.unmarshall(record.dynamodb.NewImage)
      );
      console.log('Converted records', newImages);
      callback(null, `Success`);
    }
    
  • -1

    我认为这只是每个应用程序的自定义转换练习 . 从DynamoDB的项目格式到您的应用程序格式的简单转换可能如下所示:

    var response = {...} // your response from DynamoDB
    var formattedObjects = response.videos.map(function(video) {
        return {
            "file": video.file.S,
            "id": video.id.S,
            "canvas": video.canvas.S
        };
    });
    

    如果要为此构建通用系统,则必须处理DynamoDB的各种AttributeValue types . 像下面这样的函数可以完成这项工作,但是我更复杂的属性值类型:

    function dynamoItemToPlainObj(dynamoItem) {
        var plainObj = {};
        for (var attributeName in dynamoItem) {
            var attribute = dynamoItem[attributeName];
            var attributeValue;
            for (var itemType in attribute) {
                switch (itemType) {
                case "S":
                    attributeValue = attribute.S.toString();
                    break;
                case "N":
                    attributeValue = Number(attribute.N);
                    break;
                    // more attribute types...
                default:
                    attributeValue = attribute[itemType].toString();
                    break;
                }
            }
            plainObj[attributeName] = attributeValue;
        }
        return plainObj;
    }    
    var formattedObjects = response.videos.map(dynamoItemToPlainObj);
    
  • -1

    如果您需要在线编辑器试试这个

    https://2json.net/dynamo

  • 15

    在这里你可以找到这样做的要点:

    function mapper(data) {
    
    let S = "S";
    let SS = "SS";
    let NN = "NN";
    let NS = "NS";
    let BS = "BS";
    let BB = "BB";
    let N = "N";
    let BOOL = "BOOL";
    let NULL = "NULL";
    let M = "M";
    let L = "L";
    
    if (isObject(data)) {
        let keys = Object.keys(data);
        while (keys.length) {
            let key = keys.shift();
            let types = data[key];
    
            if (isObject(types) && types.hasOwnProperty(S)) {
                data[key] = types[S];
            } else if (isObject(types) && types.hasOwnProperty(N)) {
                data[key] = parseFloat(types[N]);
            } else if (isObject(types) && types.hasOwnProperty(BOOL)) {
                data[key] = types[BOOL];
            } else if (isObject(types) && types.hasOwnProperty(NULL)) {
                data[key] = null;
            } else if (isObject(types) && types.hasOwnProperty(M)) {
                data[key] = mapper(types[M]);
            } else if (isObject(types) && types.hasOwnProperty(L)) {
                data[key] = mapper(types[L]);
            } else if (isObject(types) && types.hasOwnProperty(SS)) {
                data[key] = types[SS];
            } else if (isObject(types) && types.hasOwnProperty(NN)) {
                data[key] = types[NN];
            } else if (isObject(types) && types.hasOwnProperty(BB)) {
                data[key] = types[BB];
            } else if (isObject(types) && types.hasOwnProperty(NS)) {
                data[key] = types[NS];
            } else if (isObject(types) && types.hasOwnProperty(BS)) {
                data[key] = types[BS];
            }
        }
    }
    
    
    return data;
    
    function isObject(value) {
        return typeof value === "object" && value !== null;
    }
    

    }

    https://gist.github.com/igorzg/c80c0de4ad5c4028cb26cfec415cc600

相关问题