如何使用改造存储 json 数组响应

how to store json array response using retrofit

我想调用一个 api 端点并在我的 android 应用程序中显示关联的响应。 api 接受该用户的参数 user_name 和 return 响应。 响应在 json 数组中,包含 json 日期、位置和 img (base64)。

回应

[
   {
        "id": "602a1901a54781517ecb717c",
        "date": "2021-02-15T06:47:29.191000",
        "location": "mall",
        "img": "/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAIBAQEBAQIBAQECAgICAgQDAgICAgUEBAMEBgUGBgYFBgYGBwkIBgcJBwYGCAsICQoKCgoKBggLDAsKDAkKCgr/2wBDAQICAgICAgUDAwUKBwYHCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgr/wAARCASvBLADASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/
}
]

我面临的问题是我无法存储响应并对其进行解析。 我正在为此使用改造。 api 调用没有问题,服务器获得成功的请求,问题出在客户端(android 应用程序)。 这是我目前拥有的代码。 ApiInterface.java

interface ApiInterface {  
    @FormUrlEncoded  
    @POST("end_point")  
    Call<List<Task>>getstatus(@Field("user_name") String user_name);  
  }

Task.java

public class Task {  
  @SerializedName("user_name")  
  public String user_name;  
  public Task(String user_name) {  
      user_name = user_name.substring(1, user_name.length()-1);  
      this.user_name= user_name;  
  }  
  public String getUser() {  
      return user_name;  
  }
  }

MainActivity.java

private void LoginRetrofit(String user_name) {  
    Retrofit retrofit = new Retrofit.Builder()  
            .baseUrl("url")  
            .addConverterFactory(GsonConverterFactory.create())  
            .build();  
  
    final ApiInterface request = retrofit.create(ApiInterface.class);  
    Call<List<Task>> call = request.getstatus(user_name);  
    Toast.makeText(getApplicationContext(), "user_name" + " " + call.request(), Toast.LENGTH_LONG).show();  
    call.enqueue(new Callback<List<Task>>() {  
        @Override  
  public void onResponse(Call<List<Task>> call, Response<List<Task>> response) {  
            try { 
                List<Task> rs=response.body();  
                Toast.makeText(getApplicationContext(), "Response" +  " "+rs, Toast.LENGTH_LONG).show();  
            }  
            catch (Exception e)  
            {  
                Log.d("REsponse error",e.getMessage());  
            }  
        }  
  
        @Override  
  public void onFailure(Call<List<Task>> call, Throwable t) {  
            Log.d("Error",t.getMessage());  
        }  
    });    
}

This is the response which is being returned.

您的数据模型 class 变量应该被序列化或具有与响应中相同的名称,以便改造能够将响应值绑定到您的模型变量。 此外,对于要使用的响应中的每个键值对,您的模型 class 中必须有一个变量。

检查此 example 以了解改造的真正工作原理。

MainActivity.java 文件中,当您在 toast 消息中打印 rs 对象时,更新代码如下,它仅打印 对象地址 而不是其中的价值。所以要打印你接收到的对象的值,你必须像 as.

一样调用对象的方法来获取值

MainActivity.java

private void LoginRetrofit(String user_name) {  
    Retrofit retrofit = new Retrofit.Builder()  
            .baseUrl("url")  
            .addConverterFactory(GsonConverterFactory.create())  
            .build();  
  
    ...  
    call.enqueue(new Callback<List<Task>>() {  
        @Override  
        public void onResponse(Call<List<Task>> call, Response<List<Task>> response) {  
            try { 
                List<Task> rs=response.body();
                if(rs.size() > 0){
                    Task user = rs.get(0);
                    String id = user.getId();
                    String location = user.getLocation();
                    Toast.makeText(getApplicationContext(),"Response : Id="+id+" and location="+location, Toast.LENGTH_LONG).show();
                }
                
            }  
            catch (Exception e)  
            {  
                Log.d("REsponse error",e.getMessage());  
            }  
        }  
  
        ... 
    });    
}

并将 Task 模型更新为

Task.java

public class Task { 
    @SerializedName("id") public String id; 
    @SerializedName("date") public String date; 
    @SerializedName("location") public String location; 
    @SerializedName("img") public String img; 

    public Task(String id, String date, String location, String img) { 
        this.id=id; 
        this.date=date; 
        this.location=location; 
        this.img=img; 
    }

    public String getId(){ return this.id; }
    public String getDate(){ return this.date; }
    public String getLocation(){ return this.location; }
    public String getImg(){ return this.img; }
}