【问题标题】:Parsing Dynamic Json Object without keys解析没有键的动态 Json 对象
【发布时间】: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


【解决方案1】:

试试这个, 删除此代码

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);
                    }

替换为以下代码

 Set<Map.Entry<String, JsonElement>> entries = jObj2.entrySet();
                for (Map.Entry<String, JsonElement> entry : entries) {   
                    Log.e("Here keys", entry.getKey()); 
                    dynamicKeys.add(entry.getKey());
                    }

【讨论】:

  • 很好的答案!节省我的时间。谢谢!!
  • @ZarNiMyoSettWin 很高兴它有帮助!如果有效,请务必接受答案
  • 我已编辑您的答案以 100% 解决我的问题,我一定会很快接受。
  • @ZarNiMyoSettWin 你几乎改变了他输入的所有内容,不要那样做
  • @TimCastelijns,是的,现在可以了。谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-25
  • 1970-01-01
相关资源
最近更新 更多