gpt4 book ai didi

java - 使用 Retrofit2 和多个内联项的简单 XML 序列化

转载 作者:行者123 更新时间:2023-11-30 00:39:45 24 4
gpt4 key购买 nike

将 Retrofit2 与 SimpleXmlConverterFactory 结合使用

我的问题是错误响应的 errorBody 中有多个内联(我相信?)错误。

我一直在引用this link from Simple XML Serialization作为我的信息来源。

我正在处理以下响应:

<?xml version="1.0" encoding="utf-8"?>
<Errors>
<Error>
<Code>1</Code>
<Info>This is why</Info>
</Error>
<Error>
<Code>2</Code>
<Info>This is why</Info>
</Error>
</Errors>

我当前的 java 对象是 ErrorResponse.java:

import org.simpleframework.xml.Element;
import org.simpleframework.xml.Root;

import java.util.List;

@Root(name="Errors")
public class ErrorResponse {

@ElementList(name="Error", inline = true)
List<Error> errors;

public ErrorResponse() {
// no arg constructor
}

public void setErrors(List<Error> errors) {
this.errors = errors;
}

public List<Error> getErrors() {
return this.errors;
}
}

和 Error.java:

import org.simpleframework.xml.Element;

public class Error {

@Element(name="Code")
int code;

@Element(name="Info")
String info;

public Error() {
// no arg constructor
}

public void setCode(int code) {
this.code = code;
}

public int getCode() {
return this.code;
}

public void setInfo(String info) {
this.info = info;
}

public String getInfo() {
return this.info;
}
}

我在尝试解析响应的 errorBody 时得到的错误是:

java.lang.RuntimeException:
org.simpleframework.xml.core.ElementException:
Element 'Error' does not have a match in class com.my.package.ErrorResponse at line 1

如果只有 1 个错误项,我将 ErrorResponse 类更改为:

..
@Root
public class ErrorResponse {

@Element(name="Error")
Error error;
...
...

然后一切正常。当有多个错误时,问题就来了。任何让这个 XML 得到正确解析的帮助或建议都会很棒。我使用以下代码对响应进行 errorBody 解析:

Converter<ResponseBody, ErrorResponse> converter = mRetrofit.responseBodyConverter(ErrorResponse.class, new Annotation[0]);
try {
ErrorResponse errorResponse = converter.convert(response.errorBody());
} catch (IOException e) {
e.printStackTrace();
}

最佳答案

  • 关闭信息,</Info> , 标签需要在您的示例 XML 中大写
  • ErrorResponse需要一个名字 Errors匹配 XML
  • @ElementList当它是 inline 时不需要指定名称
  • ErrorItem需求@Root(name = "Error")

这是 ErrorResponse 的代码:

@Root(name = "Errors")
public class ErrorResponse {

@ElementList(inline = true)
List<Error> errors;

public ErrorResponse() {
// no arg constructor
}

public void setErrors(List<Error> errors) {
this.errors = errors;
}

public List<Error> getErrors() {
return this.errors;
}
}

对于 Error :

@Root(name = "Error")
public class Error {

@Element(name = "Code")
int code;

@Element(name = "Info")
String info;

public Error() {
// no arg constructor
}

public void setCode(int code) {
this.code = code;
}

public int getCode() {
return this.code;
}

public void setInfo(String info) {
this.info = info;
}

public String getInfo() {
return this.info;
}
}

固定示例 XML:

<?xml version="1.0" encoding="utf-8"?>
<Errors>
<Error>
<Code>1</Code>
<Info>This is why</Info>
</Error>
<Error>
<Code>2</Code>
<Info>This is why</Info>
</Error>
</Errors>

关于java - 使用 Retrofit2 和多个内联项的简单 XML 序列化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42725770/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com