如何将AWS Java SDK V2类序列化为JSON或从JSON反序列化?
AWS Java SDK V2 模型类Jackson序列化/反序列化问题
问题现象
AWS Java SDK V1的模型类都是带标准getter/setter的普通POJO,直接用Jackson序列化/反序列化毫无问题:
TaskDefinition taskDefinition = ecsClient.describeTaskDefinition(new DescribeTaskDefinitionRequest().withTaskDefinition("myTaskDefinition")).getTaskDefinition(); System.out.println(new ObjectMapper().writeValueAsString(taskDefinition));
执行结果:
{"taskDefinitionArn":"...","containerDefinitions":[...]}
但切换到AWS Java SDK V2后,同样操作会得到空JSON对象:
TaskDefinition taskDefinition = ecsClient.describeTaskDefinition(DescribeTaskDefinitionRequest.builder().taskDefinition("myTaskDefinition").build()).taskDefinition(); System.out.println(new ObjectMapper().writeValueAsString(taskDefinition));
执行结果:
{}
尝试反序列化时还会抛出错误:
Cannot construct instance of `software.amazon.awssdk.services.ecs.model.TaskDefinition` (no Creators, like default constructor, exist): cannot deserialize from Object value (no delegate- or property-based Creator)
问题原因
AWS Java SDK V2的模型类采用建造者模式实现,没有默认构造器,也不提供标准setter方法,Jackson默认的序列化/反序列化规则无法识别这类类的结构,导致处理失败。
解决方法
AWS官方提供了适配Jackson的专用模块,可让Jackson正确处理V2模型类。
1. 引入依赖
如果用Maven,在pom.xml中添加依赖:
<dependency> <groupId>software.amazon.awssdk</groupId> <artifactId>aws-sdk-java2-jackson</artifactId> <version>你的SDK版本号</version> </dependency>
2. 配置ObjectMapper
创建ObjectMapper时注册AWS提供的模块:
ObjectMapper objectMapper = new ObjectMapper() .registerModule(new AwsSdkJackson2Module());
3. 正确序列化/反序列化示例
// 序列化 TaskDefinition taskDefinition = ecsClient.describeTaskDefinition(DescribeTaskDefinitionRequest.builder().taskDefinition("myTaskDefinition").build()).taskDefinition(); String json = objectMapper.writeValueAsString(taskDefinition); System.out.println(json); // 正常输出完整JSON结构 // 反序列化 TaskDefinition deserializedTaskDef = objectMapper.readValue(json, TaskDefinition.class);
内容的提问来源于stack exchange,提问作者Dasmowenator
相关产品推荐
相关产品推荐

