java - 我正在尝试将 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)
解决方案
问题出在你的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)
推荐阅读
- python - 日期列和整数列相加给出错误 TypeError: unsupported type for timedelta days component: Series
- python - 尝试创建类的实例时,不了解关于参数数量的 TypeError 的原因
- python - Python导入torch需要很长时间才能初始化
- aws-xray - 如何按段或子段过滤 X 射线轨迹
- unit-testing - 当消息有撇号时,should_panic 和 expected 不起作用
- javascript - 为什么闭包中的自由变量值在直接访问时只返回初始值?
- reactjs - Context API 奇怪的情况
- python - 尝试运行 python 包时出现“RuntimeError: invalid slot offset”
- cobol - 已更新如何修复 IF/DISPLAY 和编程数学?
- c# - ArgumentNullException:值不能为空。(参数“用户”)