在处理遗留代码时,我创建了一个扩展 com.fasterxml.jackson.databind.node.POJONode
的包装类(我无法避免这一点)。
尽管我用 @JsonRootName
注释了包装类,但它始终使用原始类名进行序列化。看起来注释完全被忽略了。如果我使用 @JsonTypeName
和 @JsonTypeInfo
(我在一些示例中发现),也会发生同样的情况。
我编写了以下简单的 JUnit 测试,证明了这个问题:
import static java.lang.String.format;
import static org.junit.Assert.assertNotNull;
import java.io.IOException;
import org.junit.Test;
import com.fasterxml.jackson.annotation.JsonRootName;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.databind.node.POJONode;
import com.fasterxml.jackson.dataformat.xml.XmlMapper;
public class POJONodeJsonRootNameTest {
static final String XML_PRE_PTRN = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>%s";
private final ObjectMapper mapper = new ObjectMapper();
private final XmlMapper xmlMapper = new XmlMapper();
@Test
public void shouldConvertObjectFromXmlToJson() throws IOException {
String xml = format(XML_PRE_PTRN,"<test><name>test</name><description>test</description></test>");
JsonNode node = xmlMapper.readTree(xml);
mapper.configure(SerializationFeature.WRAP_ROOT_VALUE,true);
String json = mapper.writeValueAsString(new TestWrapper(node));
System.out.println(json);
assertNotNull(json);
}
@JsonRootName(value = "test")
private class TestWrapper extends POJONode {
public TestWrapper(Object v) {
super(v);
}
}
}
实际结果
{"TestWrapper":{"name":"test","description":"test"}}
预期结果
{"test":{"name":"test","description":"test"}}
在pom文件中,我添加了jackson-databind
、jackson-dataformat-xml
和jackson-module-jaxb-annotations
的依赖,所有版本都是2.12.4(目前是最新的)。
如果我做错了什么,请提出修复建议,或者可能的替代方案。再次强调,由于遗留代码,我有必要扩展 POJONode
类。
对此问题的任何帮助将不胜感激。
非常感谢您的时间和帮助。