代码之家  ›  专栏  ›  技术社区  ›  Rikhil Shah

如何使用改型检索JSON的特定于项的字段

  •  0
  • Rikhil Shah  · 技术社区  · 7 年前

    这是我得到的以下json对象:

    { "1":"data", "2":"data", "3":"data", "4":"data"}
    

    数据是从传感器接收的整数。 1、2、3和;4是不同的传感器值。

    我的Api类:

    public interface DetailsAPI {
    @GET("/SET/team1/retrieve_data")
    Call<ResponseBody> getpost();
    }
    

    我的主要课程,我称之为:

    Retrofit retrofit = new Retrofit.Builder().baseUrl(ip.ip).build();
    
        final DetailsAPI api = retrofit.create(DetailsAPI.class);
        final Handler handler=new Handler();
        handler.post(new Runnable(){
            @Override
            public void run() {
                api.getpost().enqueue(new Callback<ResponseBody>() {
                    @Override
                    public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
                        try {
    
                            String res = response.body().string();
                            sensor1.setText(res);
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
    
                    }
    
                    @Override
                    public void onFailure(Call<ResponseBody> call, Throwable t) {
    
                    }
                });
                // upadte textView here
                handler.postDelayed(this,100); // set time here to refresh textView
            }
        });
    

    打印时,我得到:

    {“1”:“data”,“2”:“data”,“3”:“data”,“4”:“data”}
    

    我希望能够指定没有{“”:“”}的1、2、3和4是什么

    我想要的理想输出是

    Light : data
    Sound : data
    Temp : data
    
    4 回复  |  直到 7 年前
        1
  •  2
  •   niketshah09    7 年前

    您需要添加GSON转换器进行改装。

    创建这样的类

    class Data{
        String key;
        String value;
    }
    

    让你的界面像这样

    @GET("group/{id}/users") Call<List<Data>> groupList(@Path("id") int groupId);
    

    您的改装回拨

    Retrofit retrofit = new Retrofit.Builder().baseUrl(ip.ip).build();
    final DetailsAPI api = retrofit.create(DetailsAPI.class);
    final Handler handler=new Handler();
    handler.post(new Runnable(){ @Override public void run() { 
    api.getpost().enqueue(new Callback<List<Data>>() { 
    @Override public void onResponse(Call<List<Data>> call, Response<List<Data>> response) {
     try { List<Data> res = response.body()
    // after this us can use this list to iterate over.
     }
     catch (IOException e) { e.printStackTrace(); } } 
    @Override public void onFailure(Call<List<Data>> call, Throwable t) { } }); // upadte textView here handler.postDelayed(this,100); // set time here to refresh textView } });
    
        2
  •  1
  •   dazed'n'confused    7 年前

    将gson converter添加到您的项目中,并将pojo类创建为:

    import com.google.gson.annotations.Expose;
    import com.google.gson.annotations.SerializedName;
    
    public class SensorData{
    
    @SerializedName("1")
    @Expose
    private String sensor1;
    @SerializedName("2")
    @Expose
    private String sensor2;
    @SerializedName("3")
    @Expose
    private String sensor3;
    @SerializedName("4")
    @Expose
    private String sensor4;
    
    public String getSensor1() {
    return sensor1;
    }
    
    public void setSensor1(String sensor1) {
    this.sensor1= sensor1;
    }
    
    public String getSensor2() {
    return sensor2;
    }
    
    public void setSensor2(String sensor2) {
    this.sensor2= sensor2;
    }
    
    public String getSensor3() {
    return sensor3;
    }
    
    public void setSensor3(String sensor3) {
    this.sensor3= sensor3;
    }
    
    public String getSensor4() {
    return sensor4;
    }
    
    public void setSensor4(String sensor4) {
    this.sensor4= sensor4;
    }
    
    }
    

    API等级:

    public interface DetailsAPI {
    @GET("/SET/team1/retrieve_data")
    Call<SensorData> getPost();
    }
    

    设置 改装回拨 作为:

    Retrofit retrofit = new Retrofit.Builder()
                            .baseUrl(url)
                            .client(httpClient)
                            .addConverterFactory(GsonConverterFactory.create())
                            .build();
    
    DetailsAPI api = retrofit.create(DetailsAPI.class);
    api.getPost().enqueue(new Callback<SensorData>() {
            @Override
            public void onResponse(Call<SensorData> call, 
            Response<SensorData> response) {
                Log.d(TAG, "onResponse: ");
                SensorData sensorData = response.body();
                System.out.println("Light :"+sensorData.getSensor1());
                System.out.println("Sound :"+sensorData.getSensor2());
                System.out.println("Temp :"+sensorData.getSensor3());
                System.out.println("Fire :"+sensorData.getSensor4());
            }
    
            @Override
            public void onFailure(Call<SensorData> call, Throwable t) {
                Log.d(TAG, "onFailure: ");
            }
        });
    
        3
  •  1
  •   Maksym V.    7 年前

    因此,您的调用声明为获取ResponseBody对象作为响应。您可以创建自己的响应类并替换ResponseBody。

    您可以在此处找到一些电话: http://square.github.io/retrofit/

    它看起来像:

    @GET("group/{id}/users")
    Call<List<User>> groupList(@Path("id") int groupId);
    

    它还将影响回调,您将得到类作为响应。

        4
  •  0
  •   Navneet Krishna    7 年前

    更改模型类以获得如下响应

    public class ResponseBody {
    
    @SerializedName("1")
    @Expose
    private String _1;
    @SerializedName("2")
    @Expose
    private String _2;
    @SerializedName("3")
    @Expose
    private String _3;
    @SerializedName("4")
    @Expose
    private String _4;
    
    public String get1() {
    return _1;
    }
    
    public void set1(String _1) {
    this._1 = _1;
    }
    
    public String get2() {
    return _2;
    }
    
    public void set2(String _2) {
    this._2 = _2;
    }
    
    public String get3() {
    return _3;
    }
    
    public void set3(String _3) {
    this._3 = _3;
    }
    
    public String get4() {
    return _4;
    }
    
    public void set4(String _4) {
    this._4 = _4;
    }
    }
    

    然后像这样更改改装响应内容

        try {
    
                 ResponseBody res = response.body().string();
                 sensor1.setText("Light :"+res.get1());
                 sensor2.setText("Sound :"+res.get2()); //create textview sensor2
                 sensor3.setText("Temp :"+res.get3()); //create textview sensor3
                 } catch (IOException e) {
                        e.printStackTrace();
            }