我已经找到了很多这方面的内容,但没有人有同样的问题,我唯一能想到的就是这个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"
}
结果
检查这些结果,我可以看到,当反序列化该空字符串时,我总是在对象内部得到一个空字符串,即使我已经定义了类。
@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
答案 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;
}
}