当前位置: 首页 > 面试题库 >

使用Spring和JsonTypeInfo批注将JSON反序列化为多态对象模型

章永安
2023-03-14
问题内容

我的Spring MVC(v3.2.0.RELEASE)Web应用程序中具有以下对象模型:

public class Order {
  private Payment payment;
}

@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = As.WRAPPER_OBJECT)
@JsonSubTypes.Type(name = "creditCardPayment", value = CreditCardPayment.class)
public interface Payment {}


@JsonTypeName("creditCardPayment")
public class CreditCardPayment implements Payment {}

将Order类序列化为JSON时,得到以下结果(正是我想要的结果):

{
  "payment" : {
    "creditCardPayment": {
      ...
    } 
}

不幸的是,如果我使用上述JSON并尝试将其反序列化回我的对象​​模型,则会收到以下异常:

无法读取JSON:无法在[来源:org.apache.catalina.connector.CoyoteInputStream@19629355;中将类型id’creditCardPayment’解析为[简单类型,付款类]的子类型。第1行,第58列;(通过参考链:Order
[“
payment”]);嵌套的异常是com.fasterxml.jackson.databind.JsonMappingException:无法将类型id’creditCardPayment’解析为[简单类型,类付款]的子类型,位于[来源:org.apache.catalina.connector.CoyoteInputStream@19629355;
行:1,列:58](通过参考链:Order [“付款”])

我的应用程序是通过Spring JavaConf配置的,如下所示:

@Configuration
@EnableWebMvc
public class AppWebConf extends WebMvcConfigurerAdapter {

    @Bean
    public ObjectMapper objectMapper() {
        ObjectMapper objectMapper = new ObjectMapper();
        objectMapper.setSerializationInclusion(Include.NON_NULL);
        objectMapper.configure(MapperFeature.DEFAULT_VIEW_INCLUSION, false);
        return objectMapper;
    }

    @Bean
    public MappingJackson2HttpMessageConverter mappingJacksonMessageConverter() {
        MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
        converter.setObjectMapper(objectMapper());
        return converter;
    }

    @Bean
    public Jaxb2RootElementHttpMessageConverter jaxbMessageConverter() {
        return new Jaxb2RootElementHttpMessageConverter();
    }

    @Override
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
        converters.add(jaxbMessageConverter());
        converters.add(mappingJacksonMessageConverter());
    }
}

为了进行测试,我有一个具有2种方法的控制器,一种返回HTTP GET请求的Order(此方法有效),另一种通过HTTP
POST接受Order(此方法失败),例如

@Controller
public class TestController {

    @ResponseBody
    @RequestMapping(value = "/test", method = RequestMethod.GET)
    public Order getTest() {}

    @RequestMapping(value = "/test", method = RequestMethod.POST)
    public void postTest(@RequestBody order) {}

}

我已经尝试了关于SO的各种讨论中的所有建议,但到目前为止还没有运气。谁能发现我在做什么错?


问题答案:

尝试使用ObjectMapper.registerSubtypes而不是使用注解注册子类型



 类似资料:
  • 问题内容: 我的JSON有点弱,所以我需要一些帮助。 我正在尝试反序列化用户的JSON: 放入我用属性装饰的对象中: 我得到以下异常: Newtonsoft.Json.JsonSerializationException:在JSON中找不到必需的属性’user_id’。 这是因为JSON对象是一个数组吗?如果是这样,如何将其反序列化为一个User对象? 提前致谢! 问题答案: 正如Alexandr

  • 问题内容: 我需要将Objective- C对象序列化和反序列化为JSON以存储在CouchDB中。人们是否有通用解决方案最佳实践的示例代码?我看了几个JSON框架,它们在NSDictionary / NSArray级别停止了。即,许多框架会将NSDictionary / NSArray序列化和反序列化为JSON。但是我仍然要做将NSDictionary转换为Objective-C对象的工作。 为

  • 我有一个杰克逊多态性问题。我想将JSON数据反序列化为多态类型。通过阅读Jackson文档,我可以将JSON数据反序列化为多态类型。不过,我有一个特例。我有一个类结构如下: 注意:类栏除了继承的“类型”字段之外没有任何其他成员变量。 如果我传入上面的json数据,如: 我得到了类似“无法从end_token中反序列化类条”的信息。我相信这是因为JsonTypeInfo和JsonSubTypes注释

  • 我的RESTendpoint返回包含对象字段的响应对象。序列化一切正常,但当我开始为此API编写客户端时,我遇到了反序列化问题。我根据一些关于使用Jackson进行多态序列化的问题/文章制作了这个示例代码。它演示了这个问题。 我的期望(以及我对列表的期望 我现在拥有的Object: 但我需要反序列化除动物列表之外的其他类型的对象。救命啊!

  • 问题内容: 我在使用AJAX访问的Java服务器应用程序中有一个字符串。它看起来像以下内容: 当从服务器提取字符串时,是否有一种简单的方法可以将其转换为活动的JavaScript对象(或数组)?还是我必须手动拆分字符串并手动构建对象? 问题答案: 现代浏览器支持。 在不浏览器,您可以包括在库中。

  • 我正在使用Betfair的API开发一个REST web应用程序,因此我需要序列化/反序列化JSON,以便发送HttpRequest并读取HttpResponse。 POM依赖项 我错在哪?