Android 定制改装转换器
我将改型用作REST客户端,并得到以下响应:Android 定制改装转换器,android,json,xml,gson,Android,Json,Xml,Gson,我将改型用作REST客户端,并得到以下响应: <string xmlns="http://schemas.microsoft.com/2003/10/Serialization/">{"Response":{"Status":"success","Response........... </string> {“响应”:{“状态”:“成功”,“响应……”。。。。。。。。。。。 如果可能,我如何进行改装以在xml标记之后开始解析对象?如果没有,是否有其他解决方案?您必须编
<string xmlns="http://schemas.microsoft.com/2003/10/Serialization/">{"Response":{"Status":"success","Response........... </string>
{“响应”:{“状态”:“成功”,“响应……”。。。。。。。。。。。
如果可能,我如何进行改装以在
xml
标记之后开始解析对象?如果没有,是否有其他解决方案?您必须编写自定义代码
大概是这样的:
new Retrofit.Builder()
.baseUrl(...)
.addCallAdapterFactory(...)
.addConverterFactory(new Converter.Factory() {
@Override
public Converter<ResponseBody, YourModel> responseBodyConverter(final Type type,
final Annotation[] annotations, final Retrofit retrofit) {
return new Converter<ResponseBody, YourModel>() {
@Override
public YourModel convert(final ResponseBody value) throws IOException {
String responseString = value.string();
int startIndex = responseString.indexOf(">");
++startIndex;
int endIndex = responseString.indexOf("<", 1);
String jsonResponse = responseString.substring(startIndex, endIndex);
YourModel yourModel = new Gson().fromJson(jsonResponse, YourModel.class);
return yourModel;
}
};
}
})
.build()
.create(...);
new reformation.Builder()
.baseUrl(…)
.addCallAdapterFactory(…)
.addConverterFactory(新的Converter.Factory(){
@凌驾
公共转换器响应双转换器(最终类型,
最终注释[]注释,最终改装){
返回新转换器(){
@凌驾
公共YourModel转换(最终响应项值)引发IOException{
字符串responseString=value.String();
int startIndex=responseString.indexOf(“>”);
++startIndex;
int-endIndex=responseString.indexOf(“这很容易。据我所知,改装并不提供转换器链,但您仍然可以包装多个转换器:
final类XmlWrappedConverterFactory
扩展转换器。工厂{
//这是反序列化将委托给的转换器工厂
私有最终转换器。工厂支持转换器工厂;
私有XmlWrappedConverterFactory(最终转换器。工厂备份转换器工厂){
this.backingConverterFactory=backingConverterFactory;
}
静态转换器。工厂创建(最终转换器。工厂备份转换器工厂){
返回新的XmlWrappedConverterFactory(backingConverterFactory);
}
@凌驾
公共转换器响应BodyConverter(最终类型、最终注释[]注释、最终改装){
最终转换器responseBodyConverter=backingConverterFactory.responseBodyConverter(类型、注释、改装);
返回新的XmlWrappedResponseBodyConverter(responseBodyConverter);
}
私有静态最终类XmlWrappedResponseBodyConverter
机具转换器{
专用最终变换器;
专用XmlWrappedResponseBodyConverter(最终转换器响应二进制转换器){
此.responseBodyConverter=responseBodyConverter;
}
@凌驾
公共对象转换(最终ResponseBy ResponseBy)
抛出IOException{
//注意:为了节省内存和以流方式工作,响应不会转换为字符串
//所以快进到找到“>”为止——让我们假设它基本上是一个XML
快进(responseBody.charStream(),“>”);
//GsonConverterFactory也使用charStream(),在这一步中,流将“快进”
返回responseBodyConverter.convert(responseBody);
//然而,GsonConverterFactory关闭了charStream(),因此我们直到最后才能够读取它——事实上,还没那么糟糕
}
专用静态void快进(最终读卡器、最终字符)
抛出IOException{
//只需读取,直到找到给定字符或EOF
int-read;
while((read=reader.read())!=ch&&read!=-1){
}
}
}
}
然后构建一个改造实例很简单:
最终改装改装=新建筑商()
...
.addConverterFactory(XmlWrappedConverterFactory.create(GsonConverterFactory.create())
.build();
@Jesus Dimrix,现在你知道这个概念了。你可以自己实现解析逻辑。你知道我如何在ResponseBook中写入一些东西吗?