本系列的最后一篇译文
集成转换器
Define XML Converter
Define Gradle Dependency
Retrofit已经为我们提供了一个XML转换器,在build.graddle中添加依赖即可:
compile 'com.squareup.retrofit2:converter-simplexml:2.1.0'
现在为Retrofit添加SimpleXMLConverter作为转换器。
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(API_BASE_URL)
.client(new OkHttpClient())
.addConverterFactory(SimpleXmlConverterFactory.create())
.build();
注意添加的顺序
无论你使用哪个XML转换器,Retrofit都会将它转换为Java对象。我们需要为这个对象添加标签属性的注解。
下面是一个例子将Task类对应到tasks.xml文件。
task.xml
<rss xmlns:atom="http://www.w3.org/2005/Atom" version="2.0">
<task>
<id link="http://url-to-link.com/task-id">1</id>
<title>Retrofit XML Converter Blog Post</title>
<description>Write blog post: XML Converter with Retrofit</description>
<language>de-de</language>
</task>
</rss>
Task.class
@Root(name = "task")
public class Task {
@Element(name = "id")
private long id;
@Element(name = "title")
private String title;
@Element(name = "description")
private String description;
@Attribute(required = false)
private String link;
public Task() {}
}
定义你自己的Json转换器
Retrofit为我们提供了许多现成的转换器,但是我们仍可以自定义转换器。
第一步,集成依赖
repositories {
maven { url "http://repository.codehaus.org/org/codehaus" }
}
dependencies {
compile 'com.fasterxml.jackson.core:jackson-databind:2.4.3'
}
第二部,实现自定义JSON转换器
自定义类继承Convert接口,实现fromBody和toBody方法:
public class JacksonConverter implements Converter {
private ObjectMapper mapper = new ObjectMapper();
@Override
public Object fromBody(TypedInput body, Type type) throws ConversionException {
JavaType javaType = mapper.getTypeFactory().constructType(type);
try {
return mapper.readValue(body.in(), javaType);
} catch (IOException e) {
throw new ConversionException(e);
}
}
@Override
public TypedOutput toBody(Object object) {
try {
String charset = "UTF-8";
String json = mapper.writeValueAsString(object);
return new JsonTypedOutput(json.getBytes(charset));
} catch (IOException e) {
throw new AssertionError(e);
}
}
private static class JsonTypedOutput implements TypedOutput {
private final byte[] jsonBytes;
JsonTypedOutput(byte[] jsonBytes) { this.jsonBytes = jsonBytes; }
@Override public String fileName() { return null; }
@Override public String mimeType() { return "application/json; charset=UTF-8"; }
@Override public long length() { return jsonBytes.length; }
@Override public void writeTo(OutputStream out) throws IOException { out.write(jsonBytes); }
}
然后在你的Retrofit添加这个转化器就可以了。
网友评论