6

だから私は今までJSONのシリアライゼーション/デシリアライゼーションJacksonをうまく使っていjackson-dataformat-xml-2.3.0.jarます.

利用した

objectmapper.reader(Student.class).withRootName("prefix:student").readValue(jsonString)

私のJSON(プレフィックス付きのルート名を持つ)を正常に機能するStudentクラスに逆シリアル化します。

今、XML文字列(接頭辞付きのルート名を持つ)を次のように逆シリアル化しようとしていますStudent

XML:

<prefix:student>
  <name>
    Jack Jones
  </name>
  <id>1</id>
</prefix:student>

私のPOJO:

    @XmlAccessorType(XmlAccessType.FIELD)
    @XmlType(name = "", propOrder = {
        "name",
        "id",
        ....
    })
    @XmlRootElement(name = "student")
    public class Student
    {

        protected String name;
        BigInteger id;  
..........................
    }

私はこれを次のように使用XmlMapperして逆シリアル化していましたjackson-dataformat-xml:

xmlMapper.reader(Student.class).withRootName("prefix:student").readValue(xmlString)

次の例外が発生します。

java.io.IOException: com.ctc.wstx.exc.WstxParsingException: Undeclared namespace prefix "prefix"
 at [row,col {unknown-source}]: [1,9]
    at com.fasterxml.jackson.dataformat.xml.util.StaxUtil.throwXmlAsIOException(StaxUtil.java:24)
    at com.fasterxml.jackson.dataformat.xml.XmlFactory._createParser(XmlFactory.java:473)
    at com.fasterxml.jackson.dataformat.xml.XmlFactory._createParser(XmlFactory.java:26)
    at com.fasterxml.jackson.core.JsonFactory.createParser(JsonFactory.java:844)
    at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:2091)

Caused by: com.ctc.wstx.exc.WstxParsingException: Undeclared namespace prefix "prefix"
 at [row,col {unknown-source}]: [1,9]
    at com.ctc.wstx.sr.StreamScanner.constructWfcException(StreamScanner.java:606)
    at com.ctc.wstx.sr.StreamScanner.throwParseError(StreamScanner.java:479)
    at com.ctc.wstx.sr.InputElementStack.resolveAndValidateElement(InputElementStack.java:507)
    at com.ctc.wstx.sr.BasicStreamReader.handleStartElem(BasicStreamReader.java:2977)
    at com.ctc.wstx.sr.BasicStreamReader.handleRootElem(BasicStreamReader.java:2098)
    at com.ctc.wstx.sr.BasicStreamReader.nextFromProlog(BasicStreamReader.java:2078)
    at com.ctc.wstx.sr.BasicStreamReader.next(BasicStreamReader.java:1134)
    at com.fasterxml.jackson.dataformat.xml.XmlFactory._initializeXmlReader(XmlFactory.java:581)
    at com.fasterxml.jackson.dataformat.xml.XmlFactory._createParser(XmlFactory.java:471)
    ... 6 more

カスタムルート名を使用した XML デシリアライゼーションには何をする必要がありますか??

4

2 に答える 2

4

名前空間を無視するように XmlMapper を構成してみてください。

XMLInputFactory input = new WstxInputFactory();
input.setProperty(XMLInputFactory.IS_NAMESPACE_AWARE, Boolean.FALSE);
XmlMapper xmlMapper = new XmlMapper(new XmlFactory(input, new WstxOutputFactory()));

@XmlRootElement(name= "student") また、に変更する 必要があるかもしれません @XmlRootElement(name= "prefix:student")

編集 :

StaxMan が言ったように、あなたの問題は、宣言されていないプレフィックスを使用しているという事実から来ています。

これは、提供されたログから推測できます (1 行目と 9 行目 => 宣言されていない名前空間プレフィックス "prefix")。

XML 文字列を変更できないという印象を受けました。

ただし、可能であれば、StaxMan ソリューションの方がクリーンであり、パーサーの名前空間の検証を無効にする代わりに、名前空間の宣言を追加する必要があります。

<prefix:student xmlns:prefix="http://www.somenamespace.org">
  <name>
    Jack Jones
  </name>
  <id>1</id>
</prefix:student>
于 2016-09-06T07:47:19.313 に答える