2017-05-08 36 views
-2

我想解析這個JSON在我的應用程序,我不知道如果它的結構良好或不是,但這就是我現在從api得到的。我不知道如何讓每一個的JSONObject的鍵「號碼」,以及如何解析一個JSONObjects的JSONObject,對Android JsonParsing

{ 
    "response":"1", 
    "data":{ 
     "1":{ 
     "category_name":"first", 
     "image_url":"" 
     }, 
     "2":{ 
     "category_name":"secondType", 
     "image_url":"" 
     }, 
     "3":{ 
     "category_name":"Night", 
     "image_url":"" 
     } 
    } 
} 

任何幫助,這是我嘗試分析它

if (isAdded() && getActivity() != null && response.getString("response").equals("1")) { 
        JSONObject jsonObject = response.getJSONObject("data"); 
        for (int i = 0; i < jsonObject.length(); i++) { 
         CategoryLookBookModel lookBookModel = new CategoryLookBookModel(); 
         lookBookModel.setCategory_name(jsonObject.get(""+i).getString("category_name")); 
         lookBookModel.setCategory_image(jsonArray.getJSONObject(i).getString("image_url")); 
         list.add(lookBookModel); 
        } 
+0

驗證JSON ..嘗試:https://jsonlint.com –

+1

[如何在Java解析JSON(HTTP的可能重複:// stackoverflow.com/questions/2591098/how-to-parse-json-in-java) –

回答

1

試試這個,

JSONObject json = response.getJSONObject("data"); 
Iterator<String> keys_iteration = json.keys(); 

while (keys_iteration.hasNext()) { 
    String key = keys_iteration.next(); // this will give you 1,2,3.... 
    JSONObject jsonData = response.getJSONObject(key); // object of individual key 

    CategoryLookBookModel lookBookModel = new CategoryLookBookModel(); 
        lookBookModel.setCategory_name(jsonData.getString("category_name")); 
        lookBookModel.setCategory_image(jsonData.getString("image_url")); 
        list.add(lookBookModel); 
} 
1

JSON關鍵是動態。所以你應該使用Iterator.

使用迭代器,你可以遍歷在任一方向 列表中的所有元素。你可以通過調用next()方法訪問下一個元素。

JSONObject jsonObject = response.getJSONObject("data"); 
        Iterator iteratorObj = jsonObject .keys(); 
        while (iteratorObj.hasNext()) 
        { 
         String Str_KEY = (String)iteratorObj.next(); 
         System.out.println("Key: " + Key + "Intellij_Amiya" + Str_KEY);    

         // Do your Code// 

        } 
0

如果你正在努力手動通過JSON導航(如你正在做的事情),另一種選擇是反序列化JSON轉換成POJO的(普通Java對象)。

這樣做可以讓您使用對象。您可以爲您的JSON結構的POJO像這樣:

public class CategoryImageData { 
    public String response; 
    public Map<String, CategoryImage> data; 
} 

public class CategoryImage { 
    public String category_name; 
    public String image_url; 
} 

然後你可以使用一個庫如GSON(見https://github.com/google/gson)來反序列化JSON成一個對象:

private static final Gson gson = new Gson(); 

CategoryImageData data = gson.fromJson(jsonString, CategoryImageData.class); 

現在你有一個包含所有json數據的CategoryImageData對象。

你可以在data遍歷Map拿到鑰匙編號:

for(Map.Entry<String, CategoryImage> entry : data.entrySet()) { 
    System.out.println(entry.getKey() + ": " + entry.getValue().image_url); 
} 
0

試試這個和的build.gradle添加此compile 'com.google.code.gson:gson:2.7'

請創建JSON響應類似下面

{ 
    "response": "1", 
    "data": [{ 
      "category_name": "first", 
      "image_url": "" 
     }, 
     { 
      "category_name": "secondType", 
      "image_url": "" 
     }, 
     { 
      "category_name": "Night", 
      "image_url": "" 
     } 
    ] 
} 

並在您的包中創建模型,如下所示

import com.google.gson.annotations.Expose; 
import com.google.gson.annotations.SerializedName; 

import java.util.List; 



public class Example { 

    @SerializedName("response") 
    @Expose 
    private String response; 
    @SerializedName("data") 
    @Expose 
    private List<Categories> data = null; 

    public String getResponse() { 
     return response; 
    } 

    public void setResponse(String response) { 
     this.response = response; 
    } 

    public List<Categories> getData() { 
     return data; 
    } 

    public void setData(List<Categories> data) { 
     this.data = data; 
    } 
    public class Categories { 

     @SerializedName("category_name") 
     @Expose 
     private String categoryName; 
     @SerializedName("image_url") 
     @Expose 
     private String imageUrl; 

     public String getCategoryName() { 
      return categoryName; 
     } 

     public void setCategoryName(String categoryName) { 
      this.categoryName = categoryName; 
     } 

     public String getImageUrl() { 
      return imageUrl; 
     } 

     public void setImageUrl(String imageUrl) { 
      this.imageUrl = imageUrl; 
     } 

    } 

} 

,並在你的迴應如下解析像

Example example = new Gson().fromJson(jsonResponseString,Example.class); 
+1

這不會解析OP的問題中發佈的json。它將始終使'data' =='null'。 – nbokmans

+0

正在改變你的JSON響應,就像我在上面的回答中給你的一樣 –