@JsonInclude使用可变对象不使用Spring进行反序列化

时间:2016-11-02 15:16:32

标签: spring jackson

我已经找到了很多这方面的内容,但没有人有同样的问题,我唯一能想到的就是这个question中的最后一个答案,其中对象的可变性使得注释工作不同。

所以,我有一个这样的对象

@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;
  }
}

当从JSON反序列化此对象时,使用spring框架,如果我使用

,则originCode的值将保持为空
{   
   "originCode" : ""
}

另一方面,如果我使用此对象,其中originCode已经为空并且我将其序列化,则在序列化的json中忽略originCode。

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

--- --- EDIT

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

@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);
}

因此,在发送带身体的请求时

{   
  "originCode" : "",
  "originText" : "Original"
}

结果

  • jsonString1:&#34; {&#34; originText&#34; :&#34; Original&#34;}&#34;
  • invoiceTest1(originCode null)
  • invoiceTest2(originCode:&#34;&#34;)

检查这些结果,我可以看到,当反序列化该空字符串时,我总是在对象内部得到一个空字符串,即使我已经定义了类。

@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

1 个答案:

答案 0 :(得分:1)

由于您可能正在使用类级别注释和属性级别注释,后者覆盖前者解释here

尝试,

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


  public String getOriginCode() {
    return originCode;
  }


  public void setOriginCode(String originCode) {
    this.originCode = originCode;
  }
}