【问题标题】:Can Jackson's node structure be used to write XML?杰克逊的节点结构可以用来写XML吗?
【发布时间】:2019-10-16 12:00:24
【问题描述】:

我正在尝试设置代码以使用杰克逊创建一个节点树,然后可以使用它来编写 JSON 或 XML。我可以让 JSON 工作,但我希望它也能以这种方式输出 XML。

我的示例树如下所示:

XmlMapper NodeMap = new XmlMapper();

ObjectNode rootNode = NodeMap.createObjectNode();
ObjectNode currentNode = rootNode.putObject("Examples");
currentNode
        .put("Puppy", TRUE)
        .put("Apple", 2)
        .put("Jet", "Li");
currentNode = rootNode.putObject("Single");
currentNode.put("One", 1);

使用这棵树我可以使用

String xml = rootNode.toString();

得到

{"Examples":{"Puppy":true,"Apple":2,"Jet":"Li"},"Single":{"One":1}}

这表明树已正确构建,但我一直希望它会输出 XML,因为我将树附加到 XmlMapper。不幸的是,仅此一点似乎还不够。

我知道我可以拿另一个物体做类似的事情

XmlMapper XMap = new XmlMapper();
XMap.writeValue(new File(writePath), objectToBeConverted);

要获取 XML,但我希望使用上面的节点树,而 .writevalue 似乎不适用于节点。

如何将上述树和输出(到字符串或文件)作为 XML?这种方法有可能还是我不走运?

编辑:我使用的是 Jackson 版本 2.9.2
EDIT2:事实证明我有多个版本的杰克逊重叠,正如 andrii 在他的回答下的 cmets 中提到的那样。

【问题讨论】:

  • 在本教程中应该是 #6,但您的代码看起来不错。 baeldung.com/jackson-xml-serialization-and-deserialization
  • ".writevalue 似乎不适用于节点。"运行代码时会发生什么?你有错误吗?如果是这样,错误是什么?
  • @Code-Apprentice 我得到一个编译错误:java.lang.NoSuchMethodError: com.fasterxml.jackson.core.JsonGenerator.writeStartObject(Ljava/lang/Object;)V at com.fasterxml.jackson .databind.node.ObjectNode.serialize(ObjectNode.java:290)
  • @Alexander 请edit您的问题包含完整的错误消息和堆栈跟踪。
  • 另外,objectToBeConverted 是什么?你的意思是rootNode

标签: java xml jackson


【解决方案1】:

你应该使用writeValueAsString,例如:

    XmlMapper mapper = new XmlMapper();

    com.fasterxml.jackson.databind.node.ObjectNode rootNode = mapper.createObjectNode();
    ObjectNode currentNode = rootNode.putObject("Examples");
    currentNode
            .put("Puppy", true)
            .put("Apple", 2)
            .put("Jet", "Li");
    currentNode = rootNode.putObject("Single");
    currentNode.put("One", 1);

    String xml = mapper.writeValueAsString(rootNode);

另外,我认为您使用的是不兼容的依赖版本。我能够通过 jackson-dataformat-xml:2.9.2 和旧的 jackson-core:2.6.7 重现您的错误。确保您对 jackson-dataformat-xml 依赖项使用兼容版本。

【讨论】:

  • 这与调用 writeValue() 的 OP 代码除了写入内存中的字符串与写入磁盘上的文件有何不同?
  • writeValueAsString 只是因为 op 跳到 String xml 变量中查看 xml。但是,是的,如果您需要将结果写入文件,writeValue 可以正常工作。
  • mapper.writeValueAsString(rootNode) 给我一个编译错误:线程“main”中的异常 java.lang.NoSuchMethodError: com.fasterxml.jackson.core.JsonGenerator.writeStartObject(Ljava/lang/Object; )V at com.fasterxml.jackson.databind.node.ObjectNode.serialize(ObjectNode.java:290) 这与我从 XMap.writeValue(new File(writePath), rootNode); 得到的错误相同我在问题中提到的。
  • 您使用的是哪个版本的jackson-dataformat-xml?我用的是 2.9.8:mvnrepository.com/artifact/com.fasterxml.jackson.dataformat/…
  • @Alexander 我认为您使用的是不兼容的依赖版本。我能够通过jackson-dataformat-xml:2.9.2 和旧的jackson-core:2.6.7 重现您的错误。确保您使用兼容版本的 jackson-dataformat-xml 依赖项。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-02-28
  • 2011-12-24
  • 2020-01-14
  • 2018-12-12
  • 2014-06-17
  • 1970-01-01
  • 2017-04-20
相关资源
最近更新 更多