当前位置: 首页 > 知识库问答 >
问题:

带有jackson注释的AWS Lambda json反序列化

郭志泽
2023-03-14

我给一个有json主体的aws lambda打电话。因此,json的字段与POJO中的字段具有不同的名称。所以我所做的就是在字段中添加@JsonProperty,告诉jackson json中的名称。但出于某种原因,它似乎无法识别它们,并且所有字段都为空。如果我传递一个与POJO具有相同字段名的json,它就会工作。这是我的课:

public class Event implements Identifiable {

    @JsonProperty("distinct_id")
    private String distinctId;

    @JsonProperty("user_id")
    private Integer userId;

    @JsonDeserialize(using = LocalDateTimeDeserializer.class)
    @JsonSerialize(using = LocalDateTimeSerializer.class)
    private LocalDateTime eventDateTime;

    //Here are the getters and setters
}

如果我通过

{"distinct_id":"123", "user_id":123, "dt":"2017-01-04T08:45:04+00:00"} 

所有的字段都是空的,并且有明显的ID、userId、eventDateTime,它可以序列化,除了它也不能识别我的自定义序列化器/反序列化器,但这实际上是同一个问题。

我的结论是,出于某种原因,aws jackson没有使用注释,但它没有意义。

共有3个答案

漆雕奇
2023-03-14

听起来,注释类型和数据绑定(ObjectMapper)之间的版本不匹配:两者必须是相同的主版本。具体来说,杰克逊一号。x注释与Jackson 1一起使用。x数据绑定;和2。x加2。十、

通过Java包Jackson 1可以看到不同之处。x使用org。科德豪斯。杰克逊,而杰克逊2。x使用com。fasterxml。杰克逊。确保为使用的ObjectMapper导入正确的注释。

窦成荫
2023-03-14

请看AWS文档中的这段引用:

您不应该依赖序列化框架的任何其他功能,例如注释。如果需要自定义序列化行为,可以使用原始字节流来使用自己的序列化。

发件人:https://docs.aws.amazon.com/lambda/latest/dg/java-programming-model-req-resp.html

宗弘扬
2023-03-14

所以我找到了一个方法。您需要实现RequestStreamHandler,它为您提供可以使用的输入和输出流:

import com.amazonaws.services.lambda.runtime.RequestStreamHandler

public class ChartHandler implements RequestStreamHandler {
    private ObjectMapper objectMapper = new ObjectMapper();

    @Override
    public void handleRequest(InputStream inputStream, OutputStream outputStream, Context context) throws IOException {
        DeserializationClass deserializedInput = objectMapper.readValue(inputStream, DeserializationClass.class)
        objectMapper.writeValue(outputStream, deserializedInput); //write to the outputStream what you want to return
    }

}

拥有输入和输出流使您独立于用于解析它的格式和框架。

 类似资料:
  • 例如: 我知道有jackson注解可以这样做,但是我的字段已经用我的持久性注解进行了注解,所以我想避免重复,因为我已经有了我想忽略的注解的字段

  • 问题内容: 我正在用json主体调用aws lambda。因此json的字段与POJO中的字段名称不同。所以我要做的是在字段上添加@JsonProperty来告诉杰克逊json中的名字是什么。但是由于某种原因,它似乎无法识别它们,并且所有字段均为空。如果我传递一个具有与POJO相同的字段名称的json,那么它将起作用。这是我的课: 如果我通过 所有字段均为null,并且具有distinctId,u

  • 课程对象不包装在标记中 某些属性是属性 我需要如何注释我的对象以使FasterXML反序列化这个XML?

  • 问题内容: 我和Jackson有一个问题,我认为应该很容易解决,但是这真使我丧命。 假设我有一个看起来像这样的Java POJO类(假设对我来说是Getters和Setters): 我想将看起来像这样的JSON反序列化为User对象: 杰克逊给了我一些问题,因为用户不是JSON中的第一级对象。我显然可以制作一个具有单个User对象的UserWrapper类,然后使用该对象反序列化,但是我知道必须有

  • 下面是输出: 我的分级文件中的版本号: