当前位置: 首页 > 知识库问答 >
问题:

在尝试反序列化 XML 时,无法反序列化START_OBJECT标记的 java.lang.字符串实例

戚正业
2023-03-14

我正在尝试反序列化以 XML soap 格式接收的消息。以前这一直在工作,但由于源消息的更改,我现在遇到以下问题

Can not deserialize instance of java.lang.String out of START_OBJECT token

我可以看到这是因为消息中的以下内容....

<FieldExample xsi:type="xsd:string"></FieldExample>

我认为问题在于它试图将一个字符串数据类型赋值或“强制转换”到一个空字段上,因此抛出一个错误,指出该字段是一个对象,不能被识别为字符串。

我的问题是如何阻止反序列化程序首先尝试读取这个特定的空字段。这是我在使用Jackson的Java代码中声明的方式

@JacksonXmlProperty(localName = "FieldExample", namespace = Namespace.example)
private String fieldExample;

我尝试了以下方法,但没有成功。。。。

@JsonInclude(JsonInclude.Include.NON_EMPTY) 

关于类定义

MAPPER.setSerializationInclusion(JsonInclude.Include.NON_EMPTY);

关于映射器的创建

不幸的是,问题仍然存在。

共有1个答案

贝凯
2023-03-14

问题不包括代码示例,使用问题中找到的代码段发布工作解决方案。

给定java类:

import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;

public class Foo {

    private String bar;

    @JacksonXmlProperty(localName = "FieldExample")
    private String fieldExample;

    public String getBar() {
        return bar;
    }

    public void setBar(String bar) {
        this.bar = bar;
    }

    public String getFieldExample() {
        return fieldExample;
    }

    public void setFieldExample(String fieldExample) {
        this.fieldExample = fieldExample;
    }
}

以下测试通过,没有您提到的任何错误:

import com.fasterxml.jackson.dataformat.xml.JacksonXmlModule;
import com.fasterxml.jackson.dataformat.xml.XmlMapper;

public class FooTest {
    @Test
    public void testDeserialize()throws Exception {
        final String xml = "<root xmlns:xsi=\"http://foo.bar\">" +
                                "<bar>test</bar>" +
                                "<FieldExample xsi:type=\"xsd:string\"></FieldExample>" +
                            "</root>";
        final Foo foo =  new XmlMapper(new JacksonXmlModule())
                         .readValue(xml, Foo.class);
        org.junit.Assert.assertEquals("test",foo.getBar());
        org.junit.Assert.assertEquals("",foo.getFieldExample());
    }
}
 类似资料: