【问题标题】:Can not deserialize instance of java.lang.String out of START_OBJECT token when trying to deserialize XML尝试反序列化 XML 时,无法将 java.lang.String 实例反序列化出 START_OBJECT 令牌
【发布时间】:2021-02-01 14:47:05
【问题描述】:

我正在尝试反序列化以 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);

关于映射器的创建

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

【问题讨论】:

  • 检查Java bean 中是否有String 属性,以及XML 中是否有包含嵌套标签的对应标签,因为Jackson 将带有嵌套标签的标签视为对象,不能反序列化为纯字符串字段。
  • 您能否使用XML 有效负载和POJO 类创建一个简单的示例来重现此问题?
  • 请问,您能指出您使用的是什么版本的 Jackson 吗? jackson-dataformat-xml项目中有一个reported bug,好像从2.7.0版本开始修复了。
  • 看起来您正试图将 Object 数据类型映射到 String。共享示例负载
  • 您能否向我们展示您尝试反序列化为对象的 XML 文件?也是您的 java 对象的精简版。

标签: java json xml jackson deserialization


【解决方案1】:

问题不包含代码示例,发布带有问题中找到的 sn-ps 的工作解决方案。

给定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());
    }
}

【讨论】:

    猜你喜欢
    • 2019-06-01
    • 2013-10-23
    • 2019-12-13
    • 2019-02-08
    • 2017-09-23
    • 1970-01-01
    • 2018-05-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多