简单 XML 序列化与 Retrofit2 与多个内嵌项目

Simple XML Serialization with Retrofit2 with Multiple In-Line Items

将 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 class 更改为:

..
@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
  • @ElementListinline
  • 时不需要指定名称
  • 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>