Android 无键解析动态Json对象

Android 无键解析动态Json对象,android,json,gson,retrofit2,Android,Json,Gson,Retrofit2,我试图解析具有动态键值的远程json对象。这是我的json格式 [ { "Item": [ { "Account": "Flowers", "Today": 1, "Tomorrow": 1 } ] } ] 我不能在这里使用POJO类,因为远程json键总是动态的。所以,我用下面的方法对2进行了改进 ca

我试图解析具有动态键值的远程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());
            }
        });
call.enqueue(新回调(){
@凌驾
公共void onResponse(调用、响应){
Log.e(“这里的响应是”,response.body().toString()+”);//get“这里的响应是:[{”Item:[{”Account:“FLOWSERVE-FCD”,“今天”:1,“明天”:1}]”
JsonArray responseArray=response.body().getAsJsonArray();
试一试{
JsonObject jObj1=(JsonObject)responseArray.get(0);
JsonArray jArray=jObj1.getAsJsonArray(“项目”);
JsonObject jObj2=(JsonObject)jArray.get(0);
//如果我们知道钥匙就可以了
字符串值1=jObj2.get(“Account”).toString();//get-FLOWSERVE-FCD
字符串值2=jObj2.get(“今天”).toString();//get 1
字符串值3=jObj2.get(“明天”).toString();//get 1
//在这里,我尝试动态,但它得到了错误
ArrayList dynamicKeys=new ArrayList();//稍后创建ArrayList以存储动态键
对于(int i=0;i
如果我们知道json键,它会工作得很好,但我会被动态键困住。因此,任何想法或替代方法都值得欣赏。

试试这个, 删除此代码

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());
                    }
for(int i=0;i
替换为以下代码

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());
                    }
Set entries=jObj2.entrySet();
对于(Map.Entry:entries){
Log.e(“herekeys”,entry.getKey());
dynamicKeys.add(entry.getKey());
}

您可以使用@VladyslavMatviienko获取密钥列表,您的意思是JSONArray.names()?我使用了“import com.google.gson.JsonArray;”而不是“import org.json.JsonArray;”@pskink,我已经读了很多了。我对JSONObject(org.json.JSONObject)和JSONObject(com.google.gson.JSONObject)有点不清楚。请看
entrySet()
,然后(Vs
keys()
)那是JSONObject,不是JSONArray,但并不重要。您可以使用JSONObject,也可以在JSONObject中找到等效的方法伟大的答案!节省我的时间。谢谢@ZarNiMyoSettWin很高兴这有帮助!如果答案有效,请接受。我已经编辑了你的答案,100%修复了我的问题,我肯定会很快接受。@ZarNiMyoSettWin你几乎更改了他键入的所有内容,不要这样做that@TimCastelijns是的,现在没事了。谢谢