Java 遇到换行符时无法反序列化标记中的空内容
有以下两种课程:Java 遇到换行符时无法反序列化标记中的空内容,java,xml,jackson,deserialization,newline,Java,Xml,Jackson,Deserialization,Newline,有以下两种课程: @Data @AllArgsConstructor @NoArgsConstructor @JsonIgnoreProperties(ignoreUnknown = true) public class Structure { @JacksonXmlProperty private Info info; @Data @JsonIgnoreProperties(ignoreUnknown = true) @NoArgsConstructor @AllArgsC
@Data
@AllArgsConstructor
@NoArgsConstructor
@JsonIgnoreProperties(ignoreUnknown = true)
public class Structure {
@JacksonXmlProperty
private Info info;
@Data
@JsonIgnoreProperties(ignoreUnknown = true)
@NoArgsConstructor
@AllArgsConstructor
public class Info{
private Subinfo subinfo;
}
进行反序列化,如:
private static final XmlMapper XML_MAPPER = new XmlMapper();
Structure structure = XML_MAPPER.readValue(input, Structure.class);
其中,input
是我的XML(见下文)
出现异常:
com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot construct instance of `com.test.models.Info` (although at least one Creator exists): no String-argument constructor/factory method to deserialize from String value ('
')
此功能没有帮助:
XML_MAPPER.enable(DeserializationFeature.ACCEPT_EMPTY_STRING_AS_NULL_OBJECT);
失败的XML文件:
<?xml version='1.0' encoding='UTF-8' ?>
<Structure>
<Info>
</Info>
</Structure>
对于此XML,反序列化工作正常:
<?xml version='1.0' encoding='UTF-8' ?>
<Structure>
<Info/>
</Structure>
问题在于标签关闭方法:
VS
工作正常
当
当行终止符出现时引发异常正如其他人在其注释中已经提到的那样,
反序列化功能。接受“空字符串”作为“空字符串”对象
仅将空字符串转换为空字符串,但您的Info元素中有空格和行分隔符
其他人无法重现您的问题,因为您没有提到您也在代码或示例中使用了XML\u映射器.configure(MapperFeature.ACCEPT\u CASE\u INSENSITIVE\u PROPERTIES,true)
XML实际上应该是Info,否则该元素将被忽略
要处理空字符串和仅包含空格和/或行分隔符的字符串,可以在解析XML之前添加以下代码:
XML_MAPPER.addHandler(new DeserializationProblemHandler() {
@Override
public Object handleMissingInstantiator(DeserializationContext ctxt, Class<?> instClass,
ValueInstantiator valueInsta, JsonParser p, String msg) throws IOException {
String value = p.getValueAsString();
// ignore "empty" Info elements
if (instClass.isAssignableFrom(Info.class) && (value.isEmpty() || value.matches("[\n\s]+"))) {
return null;
}
return super.handleMissingInstantiator(ctxt, instClass, valueInsta, p, msg);
}
});
XML\u MAPPER.addHandler(新的反序列化ProblemHandler(){
@凌驾
公共对象HandleMissingInstallator(反序列化上下文ctxt,类instClass,
ValueInstantiator valueInsta、JSONP、字符串msg)引发IOException{
字符串值=p.getValueAsString();
//忽略“空”信息元素
if(instClass.isAssignableFrom(Info.class)&&(value.isEmpty()| | value.matches(“[\n\s]+”)){
返回null;
}
返回超级HandleMissingInstallator(ctxt、instClass、valueInsta、p、msg);
}
});
如果要对所有元素执行此操作,只需忽略
instClass
是一个空字符串<代码>是一个空字符串<代码>不是空字符串,因为它由空格字符组成。在您的示例中,它似乎由一个行终止符(\n
或\r\n
,具体取决于操作系统)和4个空格组成。@Andreas您是对的,这是我的输入,问题在于功能反序列化功能。接受空字符串作为空字符串对象
在这里不起作用抱歉,Jackson只处理空字符串,而不是空字符串。如果您需要,您必须自己编写一些反序列化逻辑。您能提供一个最小的git吗?我的代码工作很好两个都很好@sergionni
XML_MAPPER.addHandler(new DeserializationProblemHandler() {
@Override
public Object handleMissingInstantiator(DeserializationContext ctxt, Class<?> instClass,
ValueInstantiator valueInsta, JsonParser p, String msg) throws IOException {
String value = p.getValueAsString();
// ignore "empty" Info elements
if (instClass.isAssignableFrom(Info.class) && (value.isEmpty() || value.matches("[\n\s]+"))) {
return null;
}
return super.handleMissingInstantiator(ctxt, instClass, valueInsta, p, msg);
}
});