元素名称中包含:字符时,使用StAXON-XMLStreamException进行JSON解析

问题描述

我们正在使用StAXON(由于其通过StAX处理的性能)来解析json输入,该输入包含冒号(:)作为元素名称。冒号是JSON中的有效元素名称,但是在通过StAXON进行解析时,我们会收到异常(XMLStreamException)。

如果我将namespaceSeparator用作'\ 0'(例如new jsonxMLConfigBuilder().namespaceSeparator(Character.MIN_VALUE)),则可以使用。但这只会更改名称空间分隔符。

我的问题/疑问:

  1. 这样做安全吗?是否有机会解决问题
  2. 在解析(读取/写入)JSON时是否有忽略冒号的方法
  3. 除了基于XML的StAX解析之类的事件之外,StAXON还可以使用其他方法来解析JSON。

示例输入{"cust:person":{"name":"John Doe","phone":"555-1111"}}

例外

Exception in thread "main" javax.xml.stream.XMLStreamException: Unbound prefix: cust
at de.odysseus.staxon.base.AbstractXMLStreamScope.verify(AbstractXMLStreamScope.java:212)
at de.odysseus.staxon.base.AbstractXMLStreamScope.setStartTagClosed(AbstractXMLStreamScope.java:234)
at de.odysseus.staxon.base.AbstractXMLStreamReader.ensureStartTagClosed(AbstractXMLStreamReader.java:191)
at de.odysseus.staxon.base.AbstractXMLStreamReader.readStartElementTag(AbstractXMLStreamReader.java:272)
at de.odysseus.staxon.json.jsonxMLStreamReader.readStartElementTag(jsonxMLStreamReader.java:93)
at de.odysseus.staxon.json.jsonxMLStreamReader.consume(jsonxMLStreamReader.java:202)
at de.odysseus.staxon.json.jsonxMLStreamReader.consume(jsonxMLStreamReader.java:153)
at de.odysseus.staxon.json.jsonxMLStreamReader.consume(jsonxMLStreamReader.java:183)
at de.odysseus.staxon.json.jsonxMLStreamReader.consume(jsonxMLStreamReader.java:153)
at de.odysseus.staxon.json.jsonxMLStreamReader.consume(jsonxMLStreamReader.java:183)
at de.odysseus.staxon.base.AbstractXMLStreamReader.initialize(AbstractXMLStreamReader.java:216)
at de.odysseus.staxon.json.jsonxMLStreamReader.initialize(jsonxMLStreamReader.java:87)
at de.odysseus.staxon.json.jsonxMLStreamReader.(jsonxMLStreamReader.java:78)
at de.odysseus.staxon.json.jsonxMLInputFactory.createXMLStreamReader(jsonxMLInputFactory.java:150)
at de.odysseus.staxon.json.jsonxMLInputFactory.createXMLStreamReader(jsonxMLInputFactory.java:45)
at jsonxml.main(jsonxml.java:27)

谢谢

解决方法

冒号是合法的名称字符,以防解析器无法识别名称空间。您应该能够关闭基础XMLInputFactory上的名称空间意识(不知道StAXON的详细信息)。

,

这样做很安全,但可能不是您想要的。由于StAXON试图将JSON像XML一样对待,因此您应该为库提供所需的内容:“ cust”前缀的名称空间。了解有关StAXON‘s conventions here的信息。

要声明名称空间:

new JsonXMLConfigBuilder().namespaceMapping(„cust“,„http://example.com/ns/cust“)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...