【问题标题】:How to deserialize xml that has same names in attribute and in property?如何反序列化在属性和属性中具有相同名称的xml?
【发布时间】:2019-06-07 09:35:32
【问题描述】:

Jackson 抛出 jackson.databind.JsonMappingException:属性“NewStatus”的 getter 定义冲突,因为属性和属性中的名称相同。

我尝试在解析过程中更改属性名称,使用“拐杖”在“New_Status”上交换“NewStatus”,但这会导致很多不同的问题。

<Test NewStatus="1111111">
    <NewStatus Description="TestDesc"/>
</Test>

@Data
public static class Test {

@JacksonXmlProperty(isAttribute = true, localName = "NewStatus")
private String newStatusAttribute;

@JacksonXmlProperty(localName = "NewStatus")
private NewStatus newStatusTag;

@Data
public static class NewStatus {

@JacksonXmlProperty(localName = "Description")
private String description;
}
}

我希望 Jackson 解析属性和属性中的值。

【问题讨论】:

    标签: java xml jackson jackson-databind jackson-dataformat-xml


    【解决方案1】:

    似乎存在一个已知问题。但是我尝试根据您的 XML 结构生成。在代码下方找到。有一个小问题,您可以对此进行更多探索。

    import com.fasterxml.jackson.xml.annotate.JacksonXmlProperty;
    import com.fasterxml.jackson.xml.annotate.JacksonXmlRootElement;
    
    @JacksonXmlRootElement(localName = "NewStatus")
    public class NewStatus {
      @JacksonXmlProperty(isAttribute = true)
      private String description;
    
        public String getDescription() {
            return description;
        }
    
        public void setDescription(String description) {
            this.description = description;
        }
    }
    
    
    import com.fasterxml.jackson.xml.annotate.JacksonXmlProperty;
    import org.codehaus.jackson.annotate.JsonIgnore;
    
    public class Test {
      @JacksonXmlProperty(isAttribute = true, localName = "NewStatus")
      private String statusAttribute;
    
      @JacksonXmlProperty(localName = "NewStatus")
      @JsonIgnore
      private NewStatus newStatus;
    
      public String getStatusAttribute() {
        return statusAttribute;
      }
    
      public void setStatusAttribute(String statusAttribute) {
        this.statusAttribute = statusAttribute;
      }
    
      public NewStatus getNewStatus() {
        return newStatus;
      }
    
      public void setNewStatus(NewStatus newStatus) {
        this.newStatus = newStatus;
      }
    }
    

    测试代码进行验证。

    import com.fasterxml.jackson.xml.XmlMapper;
    
    import java.io.IOException;
    
    public class Test1 {
    
      public static void main(String[] args) throws IOException {
        final XmlMapper xmlMapper = new XmlMapper();
    
        NewStatus newStatus = new NewStatus();
        newStatus.setDescription("TestDesc");
    
        Test test = new Test();
        test.setNewStatus(newStatus);
        test.setStatusAttribute("1111111");
    
        String xmlStr = xmlMapper.writeValueAsString(test);
    
        System.out.println(xmlStr);
      }
    }
    

    生成的xml如下所示。

    <Test NewStatus="1111111"><newStatus description="TestDesc"/></Test>
    

    如果您仔细观察,&lt;newStatus ...&gt; 尽管付出了一些努力,但还是会有所不同。这是小问题。您可以相应地更改标签名称和变量名称。

    此外,我在我的 maven pom.xml 文件中添加了以下依赖项。

    <dependency>
                <groupId>com.fasterxml</groupId>
                <artifactId>jackson-xml-databind</artifactId>
                <version>0.6.2</version>
            </dependency>
            <dependency>
                <groupId>org.codehaus.woodstox</groupId>
                <artifactId>woodstox-core-asl</artifactId>
                <version>4.1.4</version>
            </dependency>
    

    希望这篇文章对你有用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-24
      • 1970-01-01
      • 1970-01-01
      • 2020-10-25
      相关资源
      最近更新 更多