首页 > 解决方案 > 我正在尝试将 Xml doc 转换为 java obj。它显示参数 serviceproviders 的数组索引超出范围异常

问题描述

import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlElementWrapper;
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlRootElement;
@JsonIgnoreProperties(ignoreUnknown = true)
@JacksonXmlRootElement(localName = "Data")
public class Data {
    @JacksonXmlProperty(localName="ServiceProviders")
private ServiceProviders serviceproviders;

public ServiceProviders getServiceproviders() {
    return serviceproviders;
}

public void setServiceproviders(ServiceProviders serviceproviders) {
    this.serviceproviders = serviceproviders;
}

public Data() {
    super();
}

@Override
public String toString() {
    return "Data [serviceproviders=" + serviceproviders + "]";
}


}

import java.util.ArrayList;
import java.util.List;

import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlElementWrapper;
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlRootElement;
@JsonIgnoreProperties(ignoreUnknown = true)
@JacksonXmlRootElement(localName = "ServiceProviders")
public class ServiceProviders {
    
    @JacksonXmlElementWrapper(localName="ServiceProvider")
@JsonProperty("ServiceProvider")
private List<ServiceProvider> serviceprovider;

public ServiceProviders() {
    super();
}

public List<ServiceProvider> getServiceprovider() {
    return serviceprovider;
}

public void setServiceprovider(List<ServiceProvider> serviceprovider) {
    this.serviceprovider = serviceprovider;
}

@Override
public String toString() {
    return "ServiceProviders [serviceprovider=" + serviceprovider + "]";
}
}
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlElementWrapper;
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlRootElement;
@JacksonXmlRootElement(localName = "ServiceProvider")
public class ServiceProvider {
    
    @JacksonXmlProperty(localName = "ID")
      @JsonProperty("ID")
    private String id;
    @JacksonXmlProperty(localName = "Name")
    private String Name;
    
    public ServiceProvider() {
        super();
    }
    
    public String getId() {
        
        return id;
    }
    public void setId(String id) {
        this.id = id;
    }
    public String getName() {
        return Name;
    }
    public void setName(String name) {
        Name = name;
    }
    public ServiceProvider(String id, String name) {
        super();
        this.id = id;
        Name = name;
    }
    @Override
    public String toString() {
        return "ServiceProvider [id=" + id + ", Name=" + Name + "]";
    }
    
   
}
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.dataformat.xml.XmlMapper;
import org.apache.commons.lang3.StringUtils;

import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Paths;

public class Parser {
    public static void main(String[] args) throws IOException {
        ObjectMapper objectMapper = new XmlMapper();
        // Reads from XML and converts to POJO
        Data data = objectMapper.readValue(
                StringUtils.toEncodedString(Files.readAllBytes(Paths.get("C:\\Users\\d.roopa.gadiparthi\\Desktop\\sprint25\\CREtoJSON\\src\\main\\resources\\CRE.xml")), StandardCharsets.UTF_8),
                Data.class);
        System.out.println(data.getServiceproviders().getServiceprovider().get(1));
//        ServiceProvider data1 = objectMapper.readValue(
//                StringUtils.toEncodedString(Files.readAllBytes(Paths.get("C:\\Users\\d.roopa.gadiparthi\\Desktop\\sprint25\\CREtoJSON\\src\\main\\resources\\CRE.xml")), StandardCharsets.UTF_8),
//                ServiceProvider.class);
//        System.out.println(data1.getId()+data1.getName());
       
    }
}

<Data>
<ServiceProviders>
      <ServiceProvider ID="0" Name="0:Divya" />
      <ServiceProvider ID="1" Name="1:Roopa" />
      <ServiceProvider ID="2" Name="2:ransit" />
     </ServiceProviders>
  </Data>
dependecies are
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.11.1</version>
</dependency>
<dependency>
    <groupId>com.fasterxml.jackson.dataformat</groupId>
    <artifactId>jackson-dataformat-xml</artifactId>
    <version>2.11.1</version>
</dependency>
<dependency>
  <groupId>org.apache.commons</groupId>
  <artifactId>commons-lang3</artifactId>
  <version>3.4</version>
</dependency>
</dependencies>

线程“主”java.lang.IndexOutOfBoundsException 中的错误异常:在 java.base/jdk.internal.util.Preconditions.outOfBounds(Preconditions.java:64) 在 java.base/jdk.internal 的索引 1 超出长度 0 的范围.util.Preconditions.outOfBoundsCheckIndex(Preconditions.java:70) 在 java.base/jdk.internal.util.Preconditions.checkIndex(Preconditions.java:248) 在 java.base/java.util.Objects.checkIndex(Objects.java :373) 在 java.base/java.util.ArrayList.get(ArrayList.java:427) 在 Parser.main(Parser.java:18)

标签: javajsonxmljackson

解决方案


问题出在你的ServiceProviders课上。<ServiceProvider>在那里,您通过以下方式对元素序列进行了建模

@JacksonXmlElementWrapper(localName = "ServiceProvider")
@JsonProperty("ServiceProvider")
private List<ServiceProvider> serviceprovider;

这意味着,在<ServiceProviders>...</ServiceProviders> 您期望这样的 XML 输入中

<ServiceProvider>
    <ServiceProvider ID="0" Name="0:Divya" />
    <ServiceProvider ID="1" Name="1:Roopa" />
    <ServiceProvider ID="2" Name="2:ransit" />
</ServiceProvider>

而不是简单地

<ServiceProvider ID="0" Name="0:Divya" />
<ServiceProvider ID="1" Name="1:Roopa" />
<ServiceProvider ID="2" Name="2:ransit" />

当然你不想要额外的<ServiceProvider>...</ServiceProvider>包装。因此,您需要将@JacksonXmlElementWrapper注释修改为简单

@JacksonXmlElementWrapper(useWrapping = false)

推荐阅读