android - 如何在不使用 GSON 或 android 中的任何其他库的情况下使用改造以字符串形式获得响应

标签 android json parsing retrofit

我正在尝试从以下 Api 获得响应:

https://api.github.com/users/username

但我不知道如何以 String 的形式获取响应,以便我可以使用 String 解析并获取 JSONObject

使用的 retrofit 版本:

retrofit:2.0.0-beta1

到目前为止我已经尝试过了:

public interface GitHubService {
        @GET("/users/{user}")
        public String listRepos(@Path("user") String user,Callback<String> callback);
    }

检索:

GitHubService service = retrofit.create(GitHubService.class);
        service.listRepos("username", new Callback<String>() {
            @Override
            public void onResponse(Response response) {
                System.out.println(response.toString());
            }

            @Override
            public void onFailure(Throwable t) {

            }
        });

异常(exception):

Caused by: java.lang.IllegalArgumentException: Could not locate call adapter for class java.lang.String. Tried:
    * retrofit.ExecutorCallAdapterFactory
            at retrofit.Utils.resolveCallAdapter(Utils.java:67)
            at retrofit.MethodHandler.createCallAdapter(MethodHandler.java:49)

任何帮助将不胜感激。

最佳答案

** 更新 ** 一个标量转换器已添加到改造中,它允许 String 响应比我下面的原始答案更简洁。

示例界面--

public interface GitHubService {
    @GET("/users/{user}")
    Call<String> listRepos(@Path("user") String user);
}

ScalarsConverterFactory 添加到您的改造构建器中。 注意:如果使用 ScalarsConverterFactory 和另一个工厂,首先添加标量工厂。

Retrofit retrofit = new Retrofit.Builder()
    .baseUrl(BASE_URL)
    .addConverterFactory(ScalarsConverterFactory.create())
    // add other factories here, if needed.
    .build();

您还需要在 gradle 文件中包含标量转换器 --

implementation 'com.squareup.retrofit2:converter-scalars:2.1.0'

--- 原始答案(仍然有效,只是更多代码)---

我同意@CommonsWare 的观点,您想要拦截请求以自己处理 JSON 似乎有点奇怪。大多数情况下,POJO 拥有您需要的所有数据,因此无需在 JSONObject 领域乱搞。我怀疑使用自定义 gson TypeAdapter 可能会更好地解决您的具体问题或改造 Converter如果您需要操作 JSON。但是,改造提供了更多通过 Gson 进行的 JSON 解析。它还管理 REST 请求中涉及的许多其他繁琐任务。仅仅因为您不想使用其中一项功能,并不意味着您必须放弃整个功能。有时您只想获取原始流,所以这里是如何做到的 -

首先,如果您使用的是 Retrofit 2,您应该开始使用 Call API。不要发送对象作为类型参数进行转换,而是使用 okhttp 中的 ResponseBody --

public interface GitHubService {
    @GET("/users/{user}")
    Call<ResponseBody> listRepos(@Path("user") String user);
}

然后你可以创建并执行你的调用 --

GitHubService service = retrofit.create(GitHubService.class);
Call<ResponseBody> result = service.listRepos(username);
result.enqueue(new Callback<ResponseBody>() {
    @Override
    public void onResponse(Response<ResponseBody> response) {
        try {
            System.out.println(response.body().string());
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    @Override
    public void onFailure(Throwable t) {
        e.printStackTrace();
    }
});

注意 上面的代码在响应对象上调用string(),它将整个响应读入一个字符串。如果您将主体传递给可以摄取流的东西,则可以改为调用 charStream()。见 ResponseBody文档。

关于android - 如何在不使用 GSON 或 android 中的任何其他库的情况下使用改造以字符串形式获得响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32617770/

相关文章:

android - 我将如何在这里实现处理程序?

android - 具有多个 fragment 的 ActionBar 选项卡

python - 用 Beautiful Soup 解析 Html 返回空列表

C - 使用 sscanf 忽略空格

android - 如何使用微调器 setOnItemLongClickListener

android - 将Kotlin下载到Android Studio中时出现与证书相关的错误

Python JSON try except block 不起作用

java - 如何正确解析这个 JSON?

javascript - 将 json 结果中的 HTML 实体放入输入字段

python - 使用 Python 解析复杂的 XML 文件