代码之家  ›  专栏  ›  技术社区  ›  ZarNi Myo Sett Win

解析没有键的动态Json对象

  •  2
  • ZarNi Myo Sett Win  · 技术社区  · 6 年前

    我试图解析具有动态键值的远程json对象。这是我的 JSON格式

    [
        {
            "Item": [
                {
                    "Account": "Flowers",
                    "Today": 1,
                    "Tomorrow": 1
                }
            ]
        }
    ]
    

    我不能在这里使用POJO类,因为远程json键总是动态的。因此,我尝试了以下改装2的方法。

    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键 ,但对我来说,它被动态键困住了。因此,任何想法或替代方法都值得赞赏。

    1 回复  |  直到 6 年前
        1
  •  1
  •   ZarNi Myo Sett Win    6 年前

    试试这个, 删除此代码

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