如何反序列化在属性和属性中具有相同名称的xml?

时间:2019-06-07 09:35:32

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

Jackson引发 jackson.databind.JsonMappingException:属性“ NewStatus”的吸气剂定义冲突,因为属性和属性名称相同。

我试图在解析过程中使用“拐杖”更改属性名称,该拐杖在“ 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从属性和属性中解析值。

1 个答案:

答案 0 :(得分:0)

似乎存在一个已知问题。但是我尝试根据您的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>

如果您仔细观察,尽管付出了许多努力,<newStatus ...>的发展却有所不同。这是个小问题。您可以相应地更改标签名称和变量名称。

此外,我在我的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>

希望这篇文章对您可能有用。