【问题标题】:How to I parse json with dynamic response key如何使用动态响应键解析 json
【发布时间】:2019-09-30 05:02:56
【问题描述】:

如何在改造中解析以下 json 响应

{
  "MH46AF4149": [
    {
      "distance": 74,
      "date": "23-09-2019"
    },
    {
      "distance": 97,
      "date": "24-09-2019"
    },
    {
      "distance": 91,
      "date": "25-09-2019"
    },
    {
      "distance": 80,
      "date": "26-09-2019"
    },
    {
      "distance": 91,
      "date": "27-09-2019"
    },
    {
      "distance": 16,
      "date": "28-09-2019"
    }
  ]
}

MH46AF4149 是一个dynamic value,它会随着每个新的回复而不断变化。

我正在使用带有 GsonConverterFactory 的 RetrofitClient。如何填充我的模型类。我应该使用哪个注释。 @Expose 不起作用

【问题讨论】:

  • 您确定每次都会得到不同的密钥吗?或者你每次都会得到不同的日期和距离?
  • 每次都有不同的键(Vehicleno)。参数距离和日期是常数
  • 检查我更新的答案。

标签: android json gson retrofit2


【解决方案1】:

按照下面的代码,

JSONObject response = new JSONObject(responseString);
Iterator<?> keys = response.keys();
while( keys.hasNext() ) {
    String key = (String)keys.next();
    if ( response.get(key) instanceof JSONObject ) {
        JSONArray array = response.getJSONArray(key);
        for(int i = 0; i < array.length(); i++){
            JSONObject element = array.getJSONObject(i);
            //now use this array object to get strings
        }
    }
}

【讨论】:

    【解决方案2】:

    您需要使用 Key Iterator 来获取此动态 Key,如下所示:

    首先存储您的 Json 响应到一个 JSONObject

    JSONObject mainJSONObj=new JSONObject(responseString);
    
    // get all keys from mainJSONObj
    Iterator<String> iterator = mainJSONObj.keys();
      while (iterator.hasNext()) {
        String key = iterator.next();
        Log.e("Your Dynamic Key: ","-> "+key);
      }
    

    您的 Retrofit2 调用应该是这样的:

    Call<String> call = mApiInterface.myApi(yourBodyParams);
    
    call.enqueue(new Callback<String>() {
                @Override
                public void onResponse(Call<String> call, Response<String> response) {
    
                    JSONObject mainJSONObj=new JSONObject(response);
    
                    // get all keys from mainJSONObj
                    Iterator<String> iterator = mainJSONObj.keys();
                    while (iterator.hasNext()) {
                        String key = iterator.next();
                        Log.e("Your Dynamic Key: ","-> "+key);
    
                        JSONArray jsonArray = (JSONArray) mainJSONObj.getJSONArray(key);
    
                        if(jsonArray!=null){
    
                            for (int i = 0 ; i < jsonArray.length();i++){
                                JSONObject jsonObject1 = jsonArray.getJSONObject(i);
    
                                String distance=jsonObject1.getString("distance");
                                String date=jsonObject1.getString("date");
    
                                Log.e("distance: ","-> "+distance);
                                Log.e("date: ","-> "+date);
                            }
                        }
                    }
                }
    
                @Override
                public void onFailure(Call<String> call, Throwable t) {
                    t.printStackTrace();
                });
    

    这对我有帮助;希望这对您也有帮助。

    【讨论】:

    • 但是我如何定义我的 pojo 类。我对此很陌生。我为@SerializedName 赋予什么价值
    【解决方案3】:

    希望这对你有帮助。

    public class Car {
    
            private String distance;
            private String date;
    
        }
    
    
    
    Gson gson = new Gson();
    
        Type listType = new TypeToken<List<Car>>() {}.getType();
        List<Car> carList = null;
        try {
            jsonResponse = new JSONObject(response);
    
            Iterator<String> keys = jsonResponse.keys();
            while (keys.hasNext()) {
                String key = (String) keys.next();
                if (jsonResponse.get(key) instanceof JSONArray) {
                    JSONArray array = jsonResponse.getJSONArray(key);
                   carList= gson.fromJson(array.toString(), listType);
    
                    if (carList != null && carList.size() > 0) {
    
                    }
    
                }
            }
    
    
        } catch (JSONException e) {
            e.printStackTrace();
        }
    

    【讨论】:

      【解决方案4】:

      你可以这样获取密钥

      //if you have single key at that time use below code
      
       try {
                 JSONObject jsonObject = new JSONObject(result.tostring);
                  Iterator<String> keys = jsonObject.keys();
                  String str_Name=keys.next();
                  JSONArray jsonElements = (JSONArray) jsonObject.getJSONArray(str_Name);
      
      //if you have multiple key you can get by for loop or while loop 
      
                  while( keys.hasNext() ) {
                      String key = (String)keys.next();
                      JSONArray jsonElement = (JSONArray) jsonObject.getJSONArray(str_Name);
                      for (int i = 0 ; i < jsonElement.length();i++){
                         JSONObject jsonObject1 = jsonElement.getJSONObject(i);
                      }
      
                      }
                  } catch (JSONException e1) {
                  e1.printStackTrace();
              }
      
      
      

      【讨论】:

        猜你喜欢
        • 2014-12-22
        • 1970-01-01
        • 2021-11-14
        • 1970-01-01
        • 2016-02-14
        • 1970-01-01
        • 2019-01-14
        • 1970-01-01
        • 2019-06-10
        相关资源
        最近更新 更多