@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属性,但这似乎只是一个全局性的改变,不适用于所讨论的注释。