为了账号安全,请及时绑定邮箱和手机立即绑定

忽略 Jackson/spring/Java 中的 RootNode 和自定义映射

忽略 Jackson/spring/Java 中的 RootNode 和自定义映射

胡子哥哥 2023-04-26 14:34:31
如果我不需要它,我怎么能忽略它?我只需要账单。如果我从 json 中删除“版本”工作正常..我在控制台日志上的错误2019-07-27 19:20:14.874  WARN 12516 --- [p-nio-80-exec-2] .w.s.m.s.DefaultHandlerExceptionResolver : Resolved [org.springframework.http.converter.HttpMessageNotReadableException: JSON parse error: Unexpected token (FIELD_NAME), expected END_OBJECT: Current token not END_OBJECT (to match wrapper object with root name 'bill'), but FIELD_NAME; nested exception is com.fasterxml.jackson.databind.exc.MismatchedInputException: Unexpected token (FIELD_NAME), expected END_OBJECT: Current token not END_OBJECT (to match wrapper object with root name 'bill'), but FIELD_NAME at [Source: (PushbackInputStream); line: 8, column: 2]]我的 json 看起来像这样{    "bill":    {        "siteId":"gkfhuj-00",        "billId":"d6334954-d1c2-4b51-bb10-11953d9511ea"        },    "version":"1"}我的 json 类我尝试使用 JsonIgnoreProperties 但它也没有帮助我写“版本”@JsonIgnoreProperties(ignoreUnknown = true)@JsonRootName(value = "bill")public class Bill {    private String siteId;    private String billId;//getters and setters我的 post 方法 lisen 对象 Bill    @PostMapping("/bill")    @ResponseBody    public ResponseEntity<String> getBill(@RequestBody Bill bill)
查看完整描述

1 回答

?
守候你守候我

TA贡献1802条经验 获得超10个赞

由于您依赖于Spring bootthrough 注释和Jackson,因此自定义反序列化器将在这里完美运行。您必须创建反序列化器类,如下所示


public class BillDeserializer extends StdDeserializer<Bill> {


    public BillDeserializer() {

        this(null);

    }


    public BillDeserializer(Class<?> vc) {

        super(vc);

    }


    @Override

    public Bill deserialize(JsonParser jp, DeserializationContext ctxt) 

      throws IOException, JsonProcessingException {


        JsonNode billNode = jp.getCodec().readTree(jp);

        Bill bill = new Bill();

        bill.setSiteId(billNode.get("bill").get("siteId").textValue());

        bill.setBillId(billNode.get("bill").get("billId").textValue());      

        return bill;

    }

}

现在你必须指示你Jackson使用这个反序列化器而不是类的默认反序列化器Bill。这是通过注册 desearilizer 来完成的。可以通过Bill类上的简单注释来完成,例如@JsonDeserialize(using = BillDeserializer.class)


您的Bill课程通常如下所示


@JsonDeserialize(using = BillDeserializer.class)

public class Bill {


    private String siteId;

    private String billId;


//getters and setters

}


查看完整回答
反对 回复 2023-04-26
  • 1 回答
  • 0 关注
  • 100 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信