【问题标题】:Pretty printing XML with Jackson library使用 Jackson 库漂亮地打印 XML
【发布时间】:2014-05-21 22:42:52
【问题描述】:

我正在尝试使用 Jackson 库通过使用 JAXB 注释将 Java 对象序列化为 XML。但是,我在漂亮地打印 XML 输出时遇到了问题。

这是我的示例代码用法:

ObjectMapper mapper = new XmlMapper();
mapper.enable(SerializationFeature.INDENT_OUTPUT);
String xml = mapper.writeValueAsString(person);

而且,我看到了以下异常。这里的问题是 Jackson 使用 Stax2Writer 作为 XML 编写器,而 Stax2 似乎不支持写入原始字符串(在这种情况下,DefaultPrettyPrinter 尝试将“\n”写入原始字符串)。

    com.fasterxml.jackson.databind.JsonMappingException: Not implemented (through reference chain: xml.serialization.jackson.dto.Person["name"])
    at com.fasterxml.jackson.databind.JsonMappingException.wrapWithPath(JsonMappingException.java:232)
    at com.fasterxml.jackson.databind.JsonMappingException.wrapWithPath(JsonMappingException.java:197)
    at com.fasterxml.jackson.databind.ser.std.StdSerializer.wrapAndThrow(StdSerializer.java:187)
    at com.fasterxml.jackson.dataformat.xml.ser.XmlBeanSerializer.serializeFields(XmlBeanSerializer.java:174)
    at com.fasterxml.jackson.databind.ser.BeanSerializer.serialize(BeanSerializer.java:152)
    at com.fasterxml.jackson.dataformat.xml.ser.XmlSerializerProvider.serializeValue(XmlSerializerProvider.java:92)
    at com.fasterxml.jackson.databind.ObjectMapper._configAndWriteValue(ObjectMapper.java:2818)
    at com.fasterxml.jackson.databind.ObjectMapper.writeValueAsString(ObjectMapper.java:2275)
    at xml.serialization.jackson.SerializationTest.main(SerializationTest.java:46)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:120)
Caused by: java.lang.UnsupportedOperationException: Not implemented
    at org.codehaus.stax2.ri.Stax2WriterAdapter.writeRaw(Stax2WriterAdapter.java:380)
    at org.codehaus.stax2.ri.Stax2WriterAdapter.writeRaw(Stax2WriterAdapter.java:373)
    at com.fasterxml.jackson.dataformat.xml.util.DefaultXmlPrettyPrinter$Lf2SpacesIndenter.writeIndentation(DefaultXmlPrettyPrinter.java:498)
    at com.fasterxml.jackson.dataformat.xml.util.DefaultXmlPrettyPrinter.writeLeafElement(DefaultXmlPrettyPrinter.java:271)
    at com.fasterxml.jackson.dataformat.xml.ser.ToXmlGenerator.writeString(ToXmlGenerator.java:489)
    at com.fasterxml.jackson.databind.ser.std.StringSerializer.serialize(StringSerializer.java:39)
    at com.fasterxml.jackson.databind.ser.std.StringSerializer.serialize(StringSerializer.java:21)
    at com.fasterxml.jackson.databind.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:541)
    at com.fasterxml.jackson.dataformat.xml.ser.XmlBeanSerializer.serializeFields(XmlBeanSerializer.java:161)
    ... 10 more

关于如何解决它的任何想法?

【问题讨论】:

    标签: xml jackson pretty-print


    【解决方案1】:

    根据 Stax2WriterAdapter 的文档,他们的默认实现是不完整的。代码中的 cmets 还说 writeRaw() 方法无法使用 Java 运行时默认的 Stax 1.0 实现。

    您应该按照this wiki page 的建议改用 Stax2 库。

    在我将以下 Maven 依赖项添加到我的项目后,下面的示例开始按预期工作:

    <dependency>
        <groupId>org.codehaus.woodstox</groupId>
        <artifactId>woodstox-core-asl</artifactId>
        <version>4.1.4</version>
    </dependency>
    

    代码示例:

    public class JacksonXmlMapper {
        public static class Person {
            final public String name;
    
            public Person(String name) {
                this.name = name;
            }
        }
    
        public static void main(String[] args) throws JsonProcessingException {
            ObjectMapper mapper = new XmlMapper();
            mapper.enable(SerializationFeature.INDENT_OUTPUT);
            System.out.println(mapper.writeValueAsString(new Person("John")));
        }
    }
    

    输出:

    <Person>
       <name>John</name>
    </Person>
    

    【讨论】:

      【解决方案2】:

      我已使用以下依赖项对上述问题进行排序。以下是这些列表:

      1) jackson-annotations-2.9.8.jar

      2) jackson-core-2.9.8.jar

      3) jackson-databind-2.9.8.jar

      4) jackson-dataformat-xml-2.9.8.jar

      5) jackson-module-jaxb-annotations-2.9.8.jar

      6) stax2-api-4.0.0.jar

      7) woodstox-core-asl-4.4.1.jar

      @Urosh T:内容已更新。

      【讨论】:

      • 请不要给出“1 个链接答案”。使用链接为您的解决方案提供参考。特别是在这种情况下,指向图像的链接不是很有帮助。请考虑编辑您的答案
      【解决方案3】:

      由于java.lang.UnsupportedOperationException:

      如果您实现了未实现的方法,您的代码应该可以正常工作。有关异常的更多见解,请查看此

      ("java.lang.UnsupportedOperationException: Not supported yet.").

      谢谢!!

      【讨论】:

      • 我已经提到,Stax2Writer 似乎不支持编写像“\n”这样的原始字符。我的问题更多是关于如何用杰克逊漂亮地打印 XML,因为他们记录了它是受支持的。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-08-08
      • 1970-01-01
      • 2017-12-19
      • 2010-09-13
      相关资源
      最近更新 更多