Форматирование данных DynamoDB в обычный JSON в AWS Lambda
Я использую 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? Этот модуль NPM называется dynamodb-marshaler
для преобразования данных DynamoDB в обычный JSON. Я ищу собственное решение, если это возможно.
Ответы
Ответ 1
AWS JavaScript SDK был недавно обновлен с помощью Client Client, который делает именно то, что вам нужно. Ознакомьтесь с примерами анонса и использования здесь: http://blogs.aws.amazon.com/javascript/post/Tx1OVH5LUZAFC6T/Announcing-the-Amazon-DynamoDB-Document-Client-in-the-AWS-SDK-for-JavaScript
Ответ 2
Я знаю, немного устарел, но у меня были те же проблемы обработки данных потока из dynamoDB в функции node js lambda. Я использовал предложенную @churro
import 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.`);
}
Надеюсь, что это поможет
Ответ 3
На самом деле вы должны использовать функцию unmarshall
из AWSJavaScriptSDK:
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`);
}
Ответ 4
Если вам нужен онлайн-редактор, попробуйте
https://2json.net/dynamo
Ответ 5
Здесь вы можете найти gist, который делает это:
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
Ответ 6
Я думаю, что это просто настраиваемое упражнение для каждого приложения. Простое преобразование формата данных 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 различными типами атрибутовValue. Функция, подобная приведенной ниже, выполнит эту работу, но я не рассмотрел тяжелую работу по обработке большинства более сложных типов значений атрибутов DynamoDB:
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);