首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >改进2:从响应体获取JSON

改进2:从响应体获取JSON
EN

Stack Overflow用户
提问于 2016-12-05 19:50:25
回答 14查看 230.2K关注 0票数 71

我想使用retrofit 2从我的api中获得string json,当我使用retrofit 1获得这个json时没有问题,但是使用retrofit 2为我返回null

这是我的json的样子。

代码语言:javascript
复制
{"id":1,"Username":"admin","Level":"Administrator"}

这是我的API

代码语言:javascript
复制
@FormUrlEncoded
@POST("/api/level")
Call<ResponseBody> checkLevel(@Field("id") int id);

下面是我的代码的样子

代码语言:javascript
复制
Retrofit retrofit = new Retrofit.Builder()
                .baseUrl(Config.BASE_URL)
                .addConverterFactory(GsonConverterFactory.create())
                .build();
        Api api = retrofit.create(Api.class);
        Call<ResponseBody> call = api.checkLevel(1);
        call.enqueue(new Callback<ResponseBody>() {
            @Override
            public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
                JsonObject post = new JsonObject().get(response.body().toString()).getAsJsonObject();
                    if (post.get("Level").getAsString().contains("Administrator")) {

                    }
            }

            @Override
            public void onFailure(Call<ResponseBody> call, Throwable t) {
            }
        });

我刚开始使用改进2,使用上面的代码,它总是使我的应用程序崩溃,因为response.body().toString()返回空。

请指导我如何获得json字符串,以便我可以将其转换为JsonObject。

EN

回答 14

Stack Overflow用户

回答已采纳

发布于 2016-12-05 19:57:15

使用此 将JSON转换为POJO,选择选项如下图所示

您将获得一个用于响应的POJO类,如下所示的

代码语言:javascript
复制
public class Result {

    @SerializedName("id")
    @Expose
    private Integer id;
    @SerializedName("Username")
    @Expose
    private String username;
    @SerializedName("Level")
    @Expose
    private String level;

    /**
    * 
    * @return
    * The id
    */
    public Integer getId() {
        return id;
    }

    /**
    * 
    * @param id
    * The id
    */
    public void setId(Integer id) {
        this.id = id;
    }

    /**
    * 
    * @return
    * The username
    */
    public String getUsername() {
        return username;
    }

    /**
    * 
    * @param username
    * The Username
    */
    public void setUsername(String username) {
        this.username = username;
    }

    /**
    * 
    * @return
    * The level
    */
    public String getLevel() {
        return level;
    }

    /**
    * 
    * @param level
    * The Level
    */
    public void setLevel(String level) {
        this.level = level;
    }

}

并使用如下接口:

代码语言:javascript
复制
@FormUrlEncoded
@POST("/api/level")
Call<Result> checkLevel(@Field("id") int id);

并像这样调用:

代码语言:javascript
复制
Call<Result> call = api.checkLevel(1);
call.enqueue(new Callback<Result>() {
    @Override
    public void onResponse(Call<Result> call, Response<Result> response) { 
     if(response.isSuccessful()){
        response.body(); // have your all data
        int id =response.body().getId();
        String userName = response.body().getUsername();
        String level = response.body().getLevel();
        }else   Toast.makeText(context,response.errorBody().string(),Toast.LENGTH_SHORT).show(); // this will tell you why your api doesnt work most of time

    }

    @Override
    public void onFailure(Call<Result> call, Throwable t) {
     Toast.makeText(context,t.toString(),Toast.LENGTH_SHORT).show(); // ALL NETWORK ERROR HERE

    }
});

并在Gradle中使用依赖项

代码语言:javascript
复制
compile 'com.squareup.retrofit2:retrofit:2.3.0'
compile 'com.squareup.retrofit2:converter-gson:2.+'

注意:该错误是因为您将JSON更改为POJO (通过在改进中使用addConverterFactory(GsonConverterFactory.create()) )。如果你想要JSON格式的响应,那么从Retrofit中删除addConverterFactory(GsonConverterFactory.create())。如果不是,则使用上面的解决方案

票数 64
EN

Stack Overflow用户

发布于 2017-09-01 13:39:23

如果你想得到JSON格式的完整响应,试试这个:

我尝试了一种新方法,可以在不创建任何模型类的情况下,以JSON格式从服务器获取整个响应。我没有使用任何模型类从服务器获取数据,因为我不知道我会得到什么响应,或者它可能会根据需求而变化。

这是JSON响应:

代码语言:javascript
复制
{"contacts": [
    {
        "id": "c200",
        "name": "sunil",
        "email": "email@gmail.com",
        "address": "xx-xx-xxxx,x - street, x - country",
        "gender" : "male",
        "phone": {
            "mobile": "+91 0000000000",
            "home": "00 000000",
            "office": "00 000000"
        }
    },
    {
        "id": "c201",
        "name": "Johnny Depp",
        "email": "johnny_depp@gmail.com",
        "address": "xx-xx-xxxx,x - street, x - country",
        "gender" : "male",
        "phone": {
            "mobile": "+91 0000000000",
            "home": "00 000000",
            "office": "00 000000"
        }
    },
    .
    .
    .
]}

API接口中的

  1. 更改参数

公共接口登录{@POST(“/index.php/User/ ApiInterface”)//您的接口链接@FormUrlEncoded调用getmovies(@Field("user_email_address") String title,@Field("user_password") String body);}在您的主活动中调用

ApiInterface call apiService = ApiClient.getClient().create(ApiInterface.class);Call call= apiService.getmovies("a@gmail.com","123456");call.enqueue(call.enqueue(){ @Override public void onResponse(Call call,Response response) { Log.e("TAG","response 33:“+ApiInterface Gson().toJson(response.body( );} @Override public void onFailure(Call call,Throwable t) { Log.e("TAG","onFailure:"+t.toString() );//请求失败导致此处记录错误}});

  • 之后可以正常使用JSON对象和JSON数组

获取参数

输出

票数 52
EN

Stack Overflow用户

发布于 2016-12-05 19:58:04

使用它来获取字符串

代码语言:javascript
复制
String res = response.body().string();

而不是

代码语言:javascript
复制
String res = response.body().toString();

并在将responsebody转换为字符串之前始终保持对null的检查

代码语言:javascript
复制
if(response.body() != null){
     //do your stuff   
}
票数 31
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40973633

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档