当前位置: 首页 > 知识库问答 >
问题:

如何使用改型将成功的响应正文转换为特定类型?

广瑞
2023-03-14

在异步模式下更新调用

public void success(T t, Response rawResponse)
@GET("/users/list")
List<User> userList();
@GET("/users/list")
Response userList();
TypedInput  getBody()
Object fromBody(TypedInput body,Type type)

我可能能够创建Converter类的实例,但这需要了解用于创建RestAdapter的Gson对象,而我可能无法访问该对象。理想情况下,我希望直接通过restadpater获得对转换器对象的引用。

  1. 是否有方法获取对改型所使用的默认转换器的引用?
  2. 有人知道默认转换器是如何构造的吗?(没有默认构造函数,有两个构造函数public GsonConverter(Gson Gson)和public GsonConverter(Gson Gson,String charset)
  3. 还有其他方法可以在同步模式下同时获得原始响应和转换后的响应吗?

共有1个答案

莫誉
2023-03-14

下面是一个StringConverter类的示例,它实现了Refitfit中的转换器。基本上,您必须重写frombody()并告诉它您想要什么。

public class StringConverter implements Converter {

    /*
     * In default cases Retrofit calls on GSON which expects a JSON which gives
     * us the following error, com.google.gson.JsonSyntaxException:
     * java.lang.IllegalStateException: Expected BEGIN_OBJECT but was
     * BEGIN_ARRAY at line x column x
     */

    @Override
    public Object fromBody(TypedInput typedInput, Type type)
            throws ConversionException {

        String text = null;
        try {
            text = fromStream(typedInput.in());
        } catch (IOException e) {
            e.printStackTrace();
        }
        return text;
    }

    @Override
    public TypedOutput toBody(Object o) {
        return null;
    }

    // Custom method to convert stream from request to string
    public static String fromStream(InputStream in) throws IOException {
        BufferedReader reader = new BufferedReader(new InputStreamReader(in));
        StringBuilder out = new StringBuilder();
        String newLine = System.getProperty("line.separator");
        String line;
        while ((line = reader.readLine()) != null) {
            out.append(line);
            out.append(newLine);
        }
        return out.toString();
    }
}

将此应用于您的请求,您必须执行以下操作:

// initializing Retrofit's rest adapter
RestAdapter restAdapter = new RestAdapter.Builder()
        .setEndpoint(ApiConstants.MAIN_URL).setLogLevel(LogLevel.FULL)
        .setConverter(new StringConverter()).build();
 类似资料:
  • 我正在尝试有一个通量通用转换器使用通用类型在Java 8。我把我的代码建立在这个答案的基础上。其思想基本上是实现这个特定的转换器->: 类型转换器->转换为我想要的任何类型。因此,我正在使用构造函数创建一个类型为的类,并返回一个方法。我想在调用上创建类似这样的多个条目:,但类类型不同。但它甚至对整数也不起作用。 当我使用此单元测试进行测试时,我得到错误:。

  • 因此,我使用WebClient发送请求,并且在使用exchange()检索响应后,我需要将主体提取到Object_1的Mono。该函数需要返回单声道 我试图弄清楚在身体里面放什么ToMono()

  • 我有一个关于使用Square改造的Android开发的问题。假设我有一个Response对象,它实际上是一个

  • 问题内容: 我正在将iOS项目迁移到Swift。我正在上课。当我从Swift调用Objective C方法时,很多Objective C类型都转换为它们的Swift对应类型。 在我的情况下,目标C 转换为Swift的。现在是我的问题了。在我的Swift类中,我从Objective C对象获得了这样的数组。现在我处于Swift世界中,我想将此数组强制转换为特定类型,而不是,因为我确定知道此数组中存在

  • 我有一个类型 现在我想做这样的事情。 如何将我的 转换为基元类型? 它给我的错误是: 将“Rating”类型转换为“number”类型可能是错误的,因为这两种类型都没有充分重叠。如果这是有意的,首先将表达式转换为“未知” 我已经经历过了,但我想要的是它的反面 编辑: tsconfig.json tsc版本:3.2.1

  • 我有一个源类,它将字符串属性定义为CharSequence(不幸的是)。 所以如下: 给我: 无法将属性“java.lang.CharSequence charSeq”映射到“java.lang.String str”。考虑声明/实现一个映射方法:“java.lang.String map(java.lang.CharSequence value)” 我如何实现这个映射器方法,并使它对我的所有映射