在springboot反序列化器中包含带有jackson的根对象

Posted

技术标签:

【中文标题】在springboot反序列化器中包含带有jackson的根对象【英文标题】:Include root object with jackson in springboot deserializer 【发布时间】:2015-10-26 00:17:07 【问题描述】:

如何在带有 spring-boot 的 jackson 反序列化器中包含 objeto 根目录?

我尝试放入 application.properties

spring.jackson.deserialization.UNWRAP_ROOT_VALUE=true

我尝试使用一个配置器

@Configuration
public class JacksonConfig 

    @Bean
    public Jackson2ObjectMapperBuilder jacksonBuilder() 
        Jackson2ObjectMapperBuilder builder = new Jackson2ObjectMapperBuilder();
        builder.featuresToEnable(DeserializationFeature.UNWRAP_ROOT_VALUE);
        builder.indentOutput(true).dateFormat(new SimpleDateFormat("dd/MM/yyyy HH:mm:ss"));
        builder.indentOutput(true);
        return builder;
    


我把注释放在我的班级里

@JsonRootName("contato")
public class TbContato extends EntityBase 

但不工作我得到了这个回报:


  "cdContato": 12,
  "dtContato": "03/08/2015 16:04:43",
  "cdUsuario": null,
  "nmParte": "Fabio Ebner",
  "nmEmailParte": "fabioebner@gmail.com",
  "nmAssunto": "Assuntttoooo",
  "dsMensagem": "mensagem nessa porra aqui",
  "dtResposta": null,
  "dsResposta": null,
  "cdUsuarioResposta": null,
  "nmUsuarioResposta": null

没有根。

【问题讨论】:

@OP 你有没有解决过这个问题?我目前也在苦苦挣扎。 【参考方案1】:

那是因为您是在序列化而不是反序列化。尝试使用

spring.jackson.serialization.WRAP_ROOT_VALUE=true

【讨论】:

【参考方案2】:

另一种选择是使用参数化的通用根包装类,如下所示:

package com.example.wrappedResponse.model;

public class ResponseWrapper<T> 
    private T contato;

    public ResponseWrapper(T contato) 
        this.contato = contato;
    

    public T getContato() 
        return response;
    

    public void setContato(T contato) 
        this.contato = contato;
    

然后在控制器中用该类型包装实体。

package com.example.wrappedResponse.controller;

import com.example.wrappedResponse.model.EntityBase;    
import com.example.wrappedResponse.model.ResponseWrapper;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.GetMapping;

@RestController
class EntityWrappingController 

    @GetMapping("/get/wrapped/base/entity")
    public ResponseWrapper<EntityBase> status() 
        EntityBase entityToWrap;
        // get you entity from application …

        return new ResponseWrapper<>(entityToWrap);
    

如果您想用同一个键包含多个响应包装,这是有道理的。

【讨论】:

以上是关于在springboot反序列化器中包含带有jackson的根对象的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Jackson 在对象中包含原始 JSON?

在 Qt Creator App 中包含 Web 查看器

在 Spring Boot + Spring Data Rest 中反序列化时忽略带有 @JsonProperty 的字段

Spring Boot:使用自定义序列化器 + 反序列化器消费和生成 XML

在 tapGesture 动作选择器中包含协议功能 - iOS Swift

如何在自定义反序列化器 Spring Boot 中读取路径变量或 URL 参数