@JsonInclude不使用Spring反序列化,而是使用可变对象

@JsonInclude不使用Spring反序列化,而是使用可变对象,spring,jackson,Spring,Jackson,关于这一点,我发现了很多,但没有人有相同的问题,我唯一能想到的是最后一个答案,即对象的可变性使注释工作不同 我有一个这样的物体 @JsonIgnoreProperties(ignoreUnknown = true) @JsonInclude(value = Include.NON_EMPTY) public class Invoice implements Serializable { @JsonInclude(value = Include.NON_EMPTY) private Str

关于这一点,我发现了很多,但没有人有相同的问题,我唯一能想到的是最后一个答案,即对象的可变性使注释工作不同

我有一个这样的物体

@JsonIgnoreProperties(ignoreUnknown = true)
@JsonInclude(value = Include.NON_EMPTY)
public class Invoice implements Serializable {
  @JsonInclude(value = Include.NON_EMPTY)
  private String originCode;

  @JsonInclude(value = Include.NON_EMPTY)
  public String getOriginCode() {
    return originCode;
  }

  @JsonInclude(value = Include.NON_EMPTY)
  public void setOriginCode(String originCode) {
    this.originCode = originCode;
  }
}
@RequestMapping(method = RequestMethod.POST, value = "/test")
@ResponseBody
public ResponseEntity<InvMessage> testInvoice(
        @PathVariable(value = "someId") @Example({ "1233232-7" }) InvoicerId invoicerId,
        @RequestBody  Invoice2 invoiceRequest,
        InvMessage messageContainer)  {

    ObjectMapper mapper = new ObjectMapper();
    try {

        String jsonString1 = mapper.writeValueAsString(invoiceRequest);
        Invoice2 invoiceTest1 = mapper.readValue(jsonString1, Invoice2.class);
        String jsonInString2 = "{\"originCode\" : \"\",\"originText\" : \"Original\"}";
        Invoice2 testInvoice = mapper.readValue(jsonInString2, Invoice2.class);

    } catch (JsonProcessingException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    return ok(messageContainer);
}
当使用spring框架从JSON反序列化此对象时,如果我使用

{   
   "originCode" : ""
}
另一方面,如果我在originCode已经为空的情况下使用这个对象并序列化它,那么originCode将在序列化的json中被忽略

为什么仅在序列化时它才起作用?当反序列化时,此对象是可变的这一事实如何影响此注释的使用


---编辑---

下面提出的解决方案并没有解决这个问题,我认为这个问题实际上是在春天。所以我试着这样做

@JsonIgnoreProperties(ignoreUnknown = true)
@JsonInclude(value = Include.NON_EMPTY)
public class Invoice implements Serializable {
  @JsonInclude(value = Include.NON_EMPTY)
  private String originCode;

  @JsonInclude(value = Include.NON_EMPTY)
  public String getOriginCode() {
    return originCode;
  }

  @JsonInclude(value = Include.NON_EMPTY)
  public void setOriginCode(String originCode) {
    this.originCode = originCode;
  }
}
@RequestMapping(method = RequestMethod.POST, value = "/test")
@ResponseBody
public ResponseEntity<InvMessage> testInvoice(
        @PathVariable(value = "someId") @Example({ "1233232-7" }) InvoicerId invoicerId,
        @RequestBody  Invoice2 invoiceRequest,
        InvMessage messageContainer)  {

    ObjectMapper mapper = new ObjectMapper();
    try {

        String jsonString1 = mapper.writeValueAsString(invoiceRequest);
        Invoice2 invoiceTest1 = mapper.readValue(jsonString1, Invoice2.class);
        String jsonInString2 = "{\"originCode\" : \"\",\"originText\" : \"Original\"}";
        Invoice2 testInvoice = mapper.readValue(jsonInString2, Invoice2.class);

    } catch (JsonProcessingException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    return ok(messageContainer);
}
结果是

  • jsonString1:“{”originText:“Original”}”
  • invoiceTest1(原始代码为空)
  • 发票测试2(原始代码:“”)
通过检查这些结果,我可以看到,当反序列化这个空字符串时,我总是在对象内部得到一个空字符串,即使我定义了类似的类

@JsonIgnoreProperties(ignoreUnknown = true)
public class Invoice2 implements Serializable {
  private static final long serialVersionUID = 1L;
  @JsonInclude(value = Include.NON_EMPTY)
  private String originCode; 
  private String originText; 
  public String getOriginCode() {
    return originCode;
  }
  public void setOriginCode(String originCode) {
    this.originCode = originCode;
  }
  public String getOriginText() {
     return originText;
  }
  public void setOriginText(String originText) {
    this.originText = originText;
  }
}

Jackson databind版本2.5

,因为您可能正在使用类级注释和属性级注释,后者将覆盖前者

试试看


这并没有解决我的问题,请检查问题中的编辑。我按照你的建议修改了课程,结果是一样的。如果我手动进行反序列化,问题就不会出现。事实上,他们只在jackson文档中提到序列化。因此,唯一的方法是使用反序列化功能。接受\u EMPTY\u STRING\u as\u NULL\u OBJECT属性,但这似乎只是一个全局性的改变,不适用于所讨论的注释。