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

Java:使用json -SpringBoot中的“​​ @class”将json反序列化为其余模板中的对象

葛飞扬
2023-03-14
问题内容

我必须实例化一个类,该类使用@class中的信息从JSON扩展了抽象类,如下所示。

"name": {
  "health": "xxx",
  "animal": {
    "_class": "com.example.Dog",
    "height" : "20"
    "color" : "white"
  }
},

在这里,抽象类是动物,而狗则扩展了动物类。因此,使用@class中的信息,我们可以直接实例化dog吗。这也是我在restTemplate中得到的响应

ResponseEntity<List<SomeListName>> response = restTemplate.exchange("http://10.150.15.172:8080/agencies", HttpMethod.GET, request, responseType);

执行此行时,将出现以下错误。由于POJO类是自动生成的,因此我无法使用 @JsonTypeInfo之 类的 注释

我正在使用Spring Boot和Maven。控制台中出现此错误。

无法读取JSON:无法构造“ MyPOJO”的实例,问题:抽象类型要么需要映射到具体类型,要么具有自定义反序列化器,要么被其他类型信息实例化


问题答案:

@JsonTypeInfo通过遵循MixIn的用法,无论生成类的事实如何,都可以使用注释

“混合注释是”:一种将注释与类相关联的方法,而无需修改(目标)类本身。

也就是说,您可以:

定义将混合类(或接口)的注释与目标类(或接口)一起使用,以使其看起来像目标类具有混合类具有的所有注释(用于配置序列化/反序列化)

这样您就可以编写您的AnimalMixIn课程,例如

@JsonTypeInfo(  
    use = JsonTypeInfo.Id.NAME,  
    include = JsonTypeInfo.As.PROPERTY,  
    property = "_class")  
@JsonSubTypes({  
    @Type(value = Cat.class, name = "com.example.Cat"),  
    @Type(value = Dog.class, name = "com.example.Dog") })  
abstract class AnimalMixIn  
{

}

并配置您的解串器

    ObjectMapper mapper = new ObjectMapper();  
    mapper.getDeserializationConfig().addMixInAnnotations(  
    Animal.class, AnimalMixIn.class);

由于您使用的春天启动,您可以查看以下博客文章,看你如何自定义ObjectMapper使用混入,自杰克逊对象映射器,尤其要注意混入的方法Jackson2ObjectMapperBuilder

应该通过转换器设置使用ObjectMapper内部自定义RestTemplate,例如

    RestTemplate restTemplate = new RestTemplate();
    List<HttpMessageConverter<?>> messageConverters = new ArrayList<>();
    MappingJackson2HttpMessageConverter jsonMessageConverter = new MappingJackson2HttpMessageConverter();
    jsonMessageConverter.setObjectMapper(objectMapper);
    messageConverters.add(jsonMessageConverter);
    restTemplate.setMessageConverters(messageConverters);
    return restTemplate;


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

  • 本文向大家介绍如何在Java中使用flexjson将JSON反序列化为Java对象?,包括了如何在Java中使用flexjson将JSON反序列化为Java对象?的使用技巧和注意事项,需要的朋友参考一下 该Flexjson 是一个轻量级 的库序列化 和反序列化 Java对象和从JSON格式允许两个对象的深与浅拷贝。为了使用flexjon运行Java程序,我们需要导入一个flexjson 包。我们可

  • 有没有办法将一般对象序列化为Json并将Json反序列化为对象<如果对象是一个实体,我可以使用Jackson 2库来实现这个目的<但是如果对象是一个普通类,我该怎么做呢? 例如,我想序列化com.datastax.driver.core.querybuilder。将更新为Json并保存到DB,然后搜索并反序列化它以更新对象,最后将其用作com.datastax.driver.core.Sessio

  • 问题内容: 我有由第三方编码为固定长度数组的json’ed 元组数组: 我想使用json魔术来获取的实例列表 请帮助我放置适当的注释,以使ObjectMapper发挥作用。 我无法控制传入的格式,而我所有的google’n都以答案来回答如何将适当的json对象(而非数组)数组映射到对象列表 问题答案: 添加以下注释: 并且它应该根据需要序列化条目。 另外:然后使用它来强制执行特定顺序是最安全的,因

  • 问题内容: 我想知道如何让Jackson JSON库将JSON反序列化为现有对象?我试图找到如何做到这一点。但它似乎只能接受一个Class并实例化它本身。 或者,如果不可能,我想知道是否有任何Java JSON反序列化库都可以做到。 对于C#,这似乎是一个相应的问题:将数据从JSON字符串覆盖到现有对象实例。似乎JSON.NET具有PopulateObject(string,object)。 问题

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