- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我正在编写一项功能,通过 SNS HTTP 请求处理来自 Amazon Simple Email Service 的回调。我想将亚马逊提供的消息解析为本地对象结构。问题是 SNS 将 JSON 消息包装成字符串,而 Jackson 无法解析它。我收到一个错误:
com.fasterxml.jackson.databind.exc.MismatchedInputException:无法构造 `xxx.email.domain.aws.ses.Notification` 的实例(尽管至少存在一个 Creator):没有字符串参数构造函数/从字符串值反序列化的工厂方法 ('{"notificationType":"Delivery","mail":{"timestamp":"2019-10-02T14:43:14.570Z"... 消息的下一个值 ... }}')
来自 SNS 的整个消息如下所示:
{
"Type" : "Notification",
"MessageId" : "4944xxxx-711d-57d4-91b8-8215cxxxxx",
"TopicArn" : "arn:aws:sns:eu-west-1:...",
"Message" : "{\"notificationType\":\"Delivery\",\"mail\":{\"timestamp\":\"2019-10-02T14:43:14.570Z\", ... next values of the message ... },\"delivery\":{\"timestamp\":\"2019-10-02T14:43:16.030Z\", ... next values of the message ... }}",
"Timestamp" : "2019-10-02T14:43:16.062Z",
"SignatureVersion" : "1",
"Signature" : "signature base64",
"SigningCertURL" : "cert url",
"UnsubscribeURL" : "unsubscribe url"
}
我的实际本地结构如下所示:
@Data
@JsonNaming(PropertyNamingStrategy.UpperCamelCaseStrategy.class)
public class MessageWrapper {
private String type;
private String messageId;
private String topicArn;
private Notification message;
private Date timestamp;
private String signatureVersion;
private String signature;
private String signingCertURL;
private String unsubscribeURL;
}
@Data
public class Notification {
private String notificationType;
private Mail mail;
}
@Data
public class Mail {
private String messageId;
private String source;
private String sourceArn;
private String sourceIp;
private String sendingAccountId;
private String[] destination;
}
我正在寻找某种方式来告诉 Jackson Message
应该从字符串中提取并作为普通 JSON 处理。
编辑
反序列化
private MessageWrapper deserializeMessage(String message) throws IOException {
return new ObjectMapper().readValue(message, MessageWrapper.class);
}
最佳答案
我认为要解决这个问题,您需要为 MessageWrapper
类中的 Notification
字段和 Mail
字段自定义反序列化器在 Notification
类中,如下所示:
public class NotificationDeserializer extends JsonDeserializer<Notification> {
@Override
public Notification deserialize(JsonParser p, DeserializationContext ctxt)
throws IOException, JsonProcessingException {
String text = p.getText();
return new ObjectMapper().readValue(text, Notification.class);
}
}
public class MailDeserializer extends JsonDeserializer<Mail> {
@Override
public Mail deserialize(JsonParser p, DeserializationContext ctxt)
throws IOException, JsonProcessingException {
String text = p.getText();
return new ObjectMapper().readValue(text, Mail.class);
}
}
在你的类上添加一些注释,如下所示:
@Data
@JsonNaming(PropertyNamingStrategy.UpperCamelCaseStrategy.class)
public class MessageWrapper {
private String type;
private String messageId;
private String topicArn;
@JsonDeserialize(using = NotificationDeserializer.class)
private Notification message;
private Date timestamp;
private String signatureVersion;
private String signature;
private String signingCertURL;
private String unsubscribeURL;
}
@Data
public class Notification {
private String notificationType;
@JsonDeserialize(using = MailDeserializer.class)
private Mail mail;
}
@Data
public class Mail {
private String messageId;
private String source;
private String sourceArn;
private String sourceIp;
private String sendingAccountId;
private String[] destination;
}
编辑 1
MailDeserializer
实际上并不需要。 NotificationDeserializer
单独处理这个问题。
编辑 2
必须在自定义反序列化器中使用新的 ObjectMapper
。
关于java - Jackson反序列化SNS消息报错MismatchedInputException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58204267/
我有以下类(class) public class Cart { private final String id; public Cart(String id) { this.id =
我有一个 PSQL 表,其中一列包含 jsonb 数据: CREATE TABLE IF NOT EXISTS user ( user_name VARCHAR(255) NOT NULL,
我正在尝试读取我的 .json 文件。是一个 VehicleRepository 类。 "{\"vehicles\":[{\"id\":\"9467d079-4502-4dba-9d23-b8506d
我正在尝试制作一个 GUI (javaFX),并尝试读取 .JSON 文件,然后将其反序列化为对象。尽管我不断收到相同的错误:MismatchedInputException。我没有制作 Spring
我在 RestController 中定义了一个 API,它接受 json 请求。输入的 pojo 如下。 class A{ class List sharedModels; } SharedMode
使用 spring 配置将数据从 json 读取到 spring bean 中,它适用于简单类型,但在尝试读取数组时出现上述错误这是我的配置 @Bean Container container() t
我正在使用 Jackson ObjectMapper像这样的类: objectMapper.treeToValue(jsonNode, MyClass.class) 其中 jsonNode 是 Jso
我在 Spring Boot 应用程序中使用com.fasterxml.jackson.databind。当我向端点发送请求时,我收到以下异常: com.fasterxml.jackson.datab
我有多个 DTO 对象,它们都如下所示: @Getter @RequiredArgsConstructor public class SomeDTO { private final String
我尝试在LinkedHashMap测试用例中将JSON映射为kotlin。当我使用json将object转换为jackson-objectmapper时,出现以下问题,请帮我解决这个问题。 const
我正在尝试使用fasterxml将json回复解析为POJO。但问题是 json 回复包含嵌套对象,其中包含反斜杠,因此在通过 ObjectMapper 读取此值时,我收到 com.fasterxml
我在请求正文中发布带有转义字符的 json 字符串,并将其映射到 Controller 中的模型,但它抛出以下异常 json string : "{\"id\":\"1\",\"desc\":\"te
谁能帮我找出我在这里做错了什么。我必须解析下面的 XML 字符串 true A01222262 Bob NEWYORK_ADDRESS
我有一个简单的类 public class AuthenticationToken { public String token; public AuthenticationToken(
具有以下json片段: "Location": { "Address": "" }, 还有我的Pojo public class Address implements Serializable
我试图读取的yaml格式如下 - name: storage scm: git src: git+https://bitbucket.org/cer/linux_storage_jenkins
我在尝试通过 Swagger 发布请求时收到以下错误。当我通过 Postman 执行此操作时,效果很好。 我正在使用 springBootVersion = '2.1.0.RELEASE',swagg
我正在尝试发布用户组: public UserGroup createUserGroup(UserGroup userGroup) { ResponseEntity userGroupResp
我正在尝试运行以下 Junit 测试: @Test public void testObjectMapper() throws IOException { String json =
我有 2 个通过 REST 调用进行通信的微服务。我有一个名为 Consumer 的实体,它具有各种字段,包括 LocalDate。当我通过 REST 调用传递该实体时,出现以下异常 Json par
我是一名优秀的程序员,十分优秀!