【发布时间】:2018-01-23 05:19:24
【问题描述】:
我想将不可变类型序列化为 json 和 xml:
序列化的 JSON 是这样的:
{
"text" : "... the text..."
}
序列化后的xml如下:
<asText>_text_</asText>
(注意文本是xml的元素文本)
java对象是这样的:
@JsonRootName("asText")
@Accessors(prefix="_")
public static class AsText {
@JsonProperty("text") @JacksonXmlText
@Getter private final String _text;
public AsText(@JsonProperty("text") final String text) {
_text = text;
}
}
请注意 _text 属性是 final(因此该对象是不可变的)并且使用 @JacksonXmlText 进行注释以便序列化为 xml 元素的文本
作为不可变对象,需要文本中的构造函数,并且构造函数的参数必须用@JsonProperty注释
public AsText(@JsonProperty("text") final String text) {
_text = text;
}
当对 JSON 进行序列化/反序列化时,一切正常 ...在对 XML 进行序列化/反序列化时出现问题:
// create the object
AsText obj = new AsText("_text_");
// init the mapper
XmlMapper mapper = new XmlMapper();
// write as xml
String xml = mapper.writeValueAsString(obj);
log.warn("Serialized Xml\n{}",xml);
// Read from xml
log.warn("Read from Xml:");
AsText objReadedFromXml = mapper.readValue(xml,
AsText.class);
log.warn("Obj readed from serialized xml: {}",
objReadedFromXml.getClass().getName());
例外是:
com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException:无法识别的字段“”(类 r01f.types.url.UrlQueryStringParam),未标记为可忽略(2 个已知属性:“值”、“名称”])看来xml模块需要对象的构造函数这样注释:
public AsText(@JsonProperty("") final String text) {
_text = text;
}
但这甚至不起作用:
com.fasterxml.jackson.databind.exc.InvalidDefinitionException:无法构造`test.types.SerializeAsXmlElementTextTest$AsText`的实例(没有像默认构造一样的创建者):无法从对象值反序列化(没有基于委托或属性的创建者)需要构造函数参数处的注解@JsonProperty("text")从JSON反序列化
...我怎样才能让它工作
【问题讨论】:
-
更新了我的答案,它不需要吸气剂。这行得通吗?
-
如果涉及到 xml 反序列化,我正在寻找完全相同的东西。据我所知,除非您更改 @SergGr 提到的
<asText><text>_text_</text></asText>之类的 xml 结构,否则这是不可能的。