Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/13.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
如何在不使用GSON或android中的任何其他库的情况下,通过改型获得字符串响应_Android_Json_Parsing_Retrofit - Fatal编程技术网

如何在不使用GSON或android中的任何其他库的情况下,通过改型获得字符串响应

如何在不使用GSON或android中的任何其他库的情况下,通过改型获得字符串响应,android,json,parsing,retrofit,Android,Json,Parsing,Retrofit,我正在尝试从以下Api获得响应: 但是我不知道如何获得String的响应,这样我就可以使用String来解析和获取JSONObject 使用的改装版本: GitHubService service = retrofit.create(GitHubService.class); service.listRepos("username", new Callback<String>() { @Override public

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

但是我不知道如何获得
String
的响应,这样我就可以使用
String
来解析和获取
JSONObject

使用的改装版本:

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

            }
        });
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)
改装:2.0.0-beta1

到目前为止,我一直在尝试:

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

任何帮助都将不胜感激。

**更新**一个标量转换器已添加到改装中,它允许
字符串
响应,比我下面的原始答案更不拘礼节

示例接口--

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

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

我同意@commonware的观点,您希望拦截请求以自己处理JSON似乎有点奇怪。大多数情况下,POJO都有您需要的所有数据,因此无需在
JSONObject
land中乱搞。我怀疑如果您需要操作JSON,使用自定义gson或改型可以更好地解决您的特定问题。然而,改型提供了更多通过Gson进行JSON解析的功能。它还管理REST请求中涉及的许多其他繁琐任务。仅仅因为你不想使用其中的一个功能,并不意味着你必须扔掉整个东西。有时您只想获得原始流,因此下面是如何做到这一点-

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

公共接口服务{
@获取(“/users/{user}”)
调用listRepos(@Path(“user”)字符串user);
}
然后您可以创建并执行您的呼叫--

GitHubService服务=改装.create(GitHubService.class);
调用结果=service.listRepos(用户名);
result.enqueue(新回调(){
@凌驾
公共响应(响应){
试一试{
System.out.println(response.body().string());
}捕获(IOE异常){
e、 printStackTrace();
}
}
@凌驾
失效时的公共无效(可丢弃的t){
e、 printStackTrace();
}
});

注意上面的代码调用响应对象上的
string()
,该对象将整个响应读取为字符串。如果您将身体传递给可以摄取流的对象,则可以调用
charStream()
。请参阅文档。

但为此,我将不得不使用异步任务,因为我发现改型比异步任务快得多,这就是为什么我要使用改型,必须有某种方法来获取JSON或字符串或任何方法。我搜索了很多,但没有找到任何东西。“我发现改型比异步任务快得多”--因为改型可能会使用
AsyncTask
,我怀疑您的实际问题在于您在进行比较时对HTTP请求所做的任何操作。,我想你很清楚这些事实,但请告诉我实现我所尝试的目标的任何方法。好的,谢谢,但是为什么Twitter Fabric使用改型来进行REST API调用,这只是他们的方式,还是背后有任何其他原因?“为什么Twitter Fabric使用改型来进行REST API调用?”--因为改型非常擅长进行REST调用,当您希望改型解析结果时。正如我所写的,这就是改造背后的要点,让它为您处理HTTP和解析管道。无论出于何种原因,您都不希望改型进行解析。这很好,但这不是改造的目的。Square的普通HTTP操作库是OkHttp(如果你的应用程序中有OkHttp,Retrotfit甚至会使用它)。如果失败,你能打印堆栈跟踪吗?我知道这不是这个问题的重点,但没有经验的人可能会复制并粘贴此代码。对于那些只想将响应转换为字符串的人,您可以将response.body()转换为字符串,方法如下:private void logJsonPayload(Object Object Object){//Log JSON string try{ObjectWriter ow=new ObjectMapper().writer();String jsonPayload=ow.writeValueAsString(object);Log.d(!!!,“JSON Payload:+jsonPayload);}catch(JsonProcessingException e){e.printStackTrace();}}}在我的改型回调中不同:public void onResponse(调用,响应){在此响应中没有方法string()。string()将“/url”this更改为“\/url”this确保在使用改型2时使用
okhttp3.ResponseBody
,而不是
com.squareup.okhttp.ResponseBody
,这将引发与问题中所述相同的错误。
public interface GitHubService {
    @GET("/users/{user}")
    Call<String> listRepos(@Path("user") String user);
}
Retrofit retrofit = new Retrofit.Builder()
    .baseUrl(BASE_URL)
    .addConverterFactory(ScalarsConverterFactory.create())
    // add other factories here, if needed.
    .build();
implementation 'com.squareup.retrofit2:converter-scalars:2.1.0'
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();
    }
});