[英]Java AWS Lambda Handler - Deeply Nested Json
我有一個深度嵌套的 json 對象,我想發送到 Java AWS Lambda。
我為請求處理程序嘗試了不同的類型。
public class LambdaHandler implements RequestHandler<Map<String, ?>, String>
public class LambdaHandler implements RequestHandler<JsonNode, String>
public class LambdaHandler implements RequestHandler<String, String>
在所有情況下,以下簡單的單級 json 都可以正常工作:
{
"hello": "world"
}
但是任何嵌套的屬性都失敗了:
{
"hello": "world",
"oh": {
"no": "it's dead"
}
}
隨着錯誤:
An error occurred during JSON parsing: java.lang.RuntimeException
java.lang.RuntimeException: An error occurred during JSON parsing
Caused by: java.io.UncheckedIOException: com.amazonaws.lambda.thirdparty.com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot deserialize instance of `java.lang.String` out of START_OBJECT token
at [Source: (ByteArrayInputStream); line: 3, column: 9] (through reference chain: java.util.LinkedHashMap["oh"])
at com.amazonaws.services.lambda.runtime.serialization.factories.JacksonFactory$InternalSerializer.fromJson(JacksonFactory.java:184)
Caused by: com.amazonaws.lambda.thirdparty.com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot deserialize instance of `java.lang.String` out of START_OBJECT token
at [Source: (ByteArrayInputStream); line: 3, column: 9] (through reference chain: java.util.LinkedHashMap["oh"])
at com.amazonaws.lambda.thirdparty.com.fasterxml.jackson.databind.exc.MismatchedInputException.from(MismatchedInputException.java:59)
at com.amazonaws.lambda.thirdparty.com.fasterxml.jackson.databind.DeserializationContext.reportInputMismatch(DeserializationContext.java:1442)
at com.amazonaws.lambda.thirdparty.com.fasterxml.jackson.databind.DeserializationContext.handleUnexpectedToken(DeserializationContext.java:1216)
at com.amazonaws.lambda.thirdparty.com.fasterxml.jackson.databind.DeserializationContext.handleUnexpectedToken(DeserializationContext.java:1126)
at com.amazonaws.lambda.thirdparty.com.fasterxml.jackson.databind.deser.std.StringDeserializer.deserialize(StringDeserializer.java:63)
at com.amazonaws.lambda.thirdparty.com.fasterxml.jackson.databind.deser.std.StringDeserializer.deserialize(StringDeserializer.java:10)
at com.amazonaws.lambda.thirdparty.com.fasterxml.jackson.databind.deser.std.MapDeserializer._readAndBindStringKeyMap(MapDeserializer.java:527)
at com.amazonaws.lambda.thirdparty.com.fasterxml.jackson.databind.deser.std.MapDeserializer.deserialize(MapDeserializer.java:364)
at com.amazonaws.lambda.thirdparty.com.fasterxml.jackson.databind.deser.std.MapDeserializer.deserialize(MapDeserializer.java:29)
at com.amazonaws.lambda.thirdparty.com.fasterxml.jackson.databind.ObjectReader._bindAndClose(ObjectReader.java:1719)
at com.amazonaws.lambda.thirdparty.com.fasterxml.jackson.databind.ObjectReader.readValue(ObjectReader.java:1228)
at com.amazonaws.services.lambda.runtime.serialization.factories.JacksonFactory$InternalSerializer.fromJson(JacksonFactory.java:182)
如何編寫允許深度嵌套 json 屬性的 AWS Java Lambda?
選項1:
將event
類型更改為Map<String, Object>
並使用 Gson 轉換為您的數據模型。
例子:
public class Handler implements RequestHandler<Map<String, Object>, String> {
@Override
public String handleRequest(Map<String, Object> event, Context context) {
Gson gson = new Gson();
MyDataModel request = gson.fromJson(gson.toJson(event), MyDataModel.class);
// use request
return "";
}
}
選項 2:
對於復雜的 json/data 模型,您可以使用RequestStreamHandler
類,它不需要您提供數據類型。 它將為您提供InputStream
,您可以將其轉換為您喜歡的任何數據模型。
例子:
public class HandlerStream implements RequestStreamHandler {
@Override
public void handleRequest(InputStream input, OutputStream output, Context context) {
BufferedReader reader = new BufferedReader(new InputStreamReader(input));
JsonElement eventElement = new JsonParser().parse(reader);
JsonObject event = (JsonObject) eventElement;
MyDataModel request = new Gson().fromJson(event, MyDataModel.class);
// use request
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.