Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/230.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 定制改装转换器_Android_Json_Xml_Gson - Fatal编程技术网

Android 定制改装转换器

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标记之后开始解析对象?如果没有,是否有其他解决方案?您必须编

我将改型用作REST客户端,并得到以下响应:

<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中写入一些东西吗?