如何在不使用GSON或android中的任何其他库的情况下使用retrofit获取响应

时间:2015-09-16 20:09:13

标签: android json parsing retrofit

我正在尝试从以下Api获得回复:

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

但我不知道如何以[{1}}获取回复,以便我可以使用String来解析并获取String

使用的改装版本:

  

改型:2.0.0-β1

我一直试过这个:

JSONObject

检索:

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) {

            }
        });

任何帮助都会非常感激。

1 个答案:

答案 0 :(得分:184)

**更新**已经添加了一个标量转换器,以便进行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土地上乱七八糟。我怀疑如果你需要操纵JSON,使用自定义gson TypeAdapter或改进Converter可能会更好地解决你的具体问题。但是,改造通过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(),它将整个响应读入String。如果您将身体传递给可以摄取流的东西,则可以改为呼叫charStream()。请参阅ResponseBody文档。