SAKA'S BLOG

Retrofit使用详解(六)

集成转换器

Define XML Converter

Define Gradle Dependency

Retrofit已经为我们提供了一个XML转换器,在build.graddle中添加依赖即可:

compile 'com.squareup.retrofit2:converter-simplexml:2.1.0'

现在为Retrofit添加SimpleXMLConverter作为转换器。

1
2
3
4
5
Retrofit retrofit = new Retrofit.Builder()  
.baseUrl(API_BASE_URL)
.client(new OkHttpClient())
.addConverterFactory(SimpleXmlConverterFactory.create())
.build();

注意添加的顺序

无论你使用哪个XML转换器,Retrofit都会将它转换为Java对象。我们需要为这个对象添加标签属性的注解。
下面是一个例子将Task类对应到tasks.xml文件。

task.xml

1
2
3
4
5
6
7
8
<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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
@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为我们提供了许多现成的转换器,但是我们仍可以自定义转换器。

第一步,集成依赖

1
2
3
4
5
6
7
repositories {  
maven { url "http://repository.codehaus.org/org/codehaus" }
}

dependencies {
compile 'com.fasterxml.jackson.core:jackson-databind:2.4.3'
}

第二部,实现自定义JSON转换器

自定义类继承Convert接口,实现fromBody和toBody方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
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添加这个转化器就可以了。