【发布时间】:2018-03-13 07:58:54
【问题描述】:
我正在尝试解析具有动态键值的远程 json 对象。这是我的 json 格式。
[
{
"Item": [
{
"Account": "Flowers",
"Today": 1,
"Tomorrow": 1
}
]
}
]
我不能在这里使用 POJO 类,因为远程 json 键总是动态的。因此,我尝试了以下方式与 Retrofit2。
call.enqueue(new Callback<JsonElement>() {
@Override
public void onResponse(Call<JsonElement> call, Response<JsonElement> response) {
Log.e("Here response is", response.body().toString() + " "); // got "Here response is: [{"Item":[{"Account":"FLOWSERVE-FCD","Today":1,"Tomorrow":1}]}] "
JsonArray responseArray= response.body().getAsJsonArray();
try {
JsonObject jObj1 = (JsonObject) responseArray.get(0);
JsonArray jArray = jObj1.getAsJsonArray("Item");
JsonObject jObj2 = (JsonObject) jArray.get(0);
// It is ok if we know the keys
String value1 = jObj2.get("Account").toString(); // get FLOWSERVE-FCD
String value2 = jObj2.get("Today").toString(); // get 1
String value3 = jObj2.get("Tomorrow").toString(); // get 1
// Here , I try for dynamic, but it got error
ArrayList<String> dynamicKeys = new ArrayList<String>(); // create ArrayList to store dynamic keys later
for (int i = 0; i < jObj2.size(); i++) {
String str_image_url = jObj2.get(i); // although use "jObj2.keys(); it can't be used here.
Log.e("Succcccc ", str_image_url);
dynamicKeys.add(str_image_url);
}
} catch (Exception e) {
e.printStackTrace();
Log.e("Grrr Again", e.toString());
}
}
@Override
public void onFailure(Call<JsonElement> call, Throwable t) {
Toast.makeText(context, t.getMessage(), Toast.LENGTH_LONG).show();
Log.e("Grrr Error", t.getMessage());
}
});
如果我们知道 json 键,它会很好地工作,但它会被动态键困住。因此,任何想法或替代方法都值得赞赏。
【问题讨论】:
-
您可以使用developer.android.com/reference/org/json/…获取密钥列表
-
@VladyslavMatviienko,你的意思是 JSONArray.names()?我使用“import com.google.gson.JsonArray;”不是“导入 org.json.JSONArray;”
-
@pskink,我已经阅读了很多内容。我对 JSONObject (org.json.JSONObject) Vs JsonObject(com.google.gson.JsonObject) 有点不清楚
-
然后查看
entrySet()(对比keys()) -
那是 JSONObject,不是 JSONArray,但并不重要。您可以使用 JSONObject,或在 JsonObject 中找到等效方法
标签: android json gson retrofit2