2015-02-10 60 views
5

我使用改進。改造:處理動態更改其名稱的JSON對象

我JSON數據是這樣的:

{ 
"elements": { 
    "159": { 
     "id": 159, 
     "name": "Alex" 
     }, 
    "831": { 
     "id": 831, 
     "name": "Sofia" 
     }, 
    "3125": { 
     "id": 3125, 
     "name": "Mark" 
     } 
    } 
} 

這個JSON的結構不能在我的身邊來配置。

我想要使用翻新處理這些對象(即動態更改其名稱)。

我現在就這樣。

型號:

public class Elements{ 
public ArrayList<ElementsItem> = new Array<ElementsItem>(); 

//getters setters 

public class ElementsItem{ 
    public ArrayList<ElementsItemDetails> = new Array<ElementsItemDetails>(); 

    //getters setters 
} 

public class ElementItemDetails{ 
    public Integer id; 
    public String name; 
    //getters setters 
}} 

API:

public interface MyApi { 

@GET("/file.php?method=getElementDetails") 
public void getDetails(@Query("ids") ArrayList<Integer> ids_list, Callback<Elements> callback); 
} 

而且在那裏我試圖處理功能數據:

public void get_details_for_particular_elements(ArrayList<Integer> ids_list){ 

    Gson gson_gd = new GsonBuilder().registerTypeAdapter(
      Elements.class, 
      new JsonDeserializer<Elements>() { 

       @Override 
       public Elementsdeserialize(JsonElement je, 
         Type type, JsonDeserializationContext jdc) 
         throws JsonParseException { 
        // TODO Auto-generated method stub 
        Log.d("my_app", "Deserialization for Getting Elements Details in progress.."); 
        JsonObject elements= je.getAsJsonObject(); 
        return new Gson().fromJson(elements, 
          Elements.class); 
       } 

      }).create(); 

    RestAdapter restAdapter = new RestAdapter.Builder() 
    .setEndpoint(Constants.URL) 
    .setConverter(new GsonConverter(gson_gd)).build(); 


    MyApi myDetails = restAdapter.create(MyApi.class); 

    myDetails.getDetails(ids_list, new Callback<Elements>() { 

     @Override 
     public void success(Elements e, Response response) { 
      // TODO Auto-generated method stub 

      Log.d("my_app", "Success! " + e.getElementsItem().get(0).getElementsItemDetails().get(0).getName()); 

     } 

     @Override 
     public void failure(RetrofitError retrofitError) { 
      // TODO Auto-generated method stub 
      Log.d("my_app", "Failure..." + retrofitError); 
     } 


    }); 
} 

我試圖處理名爲 「亞歷克斯」 和打印它在LogCat中,但我不能 - 應用程序停止。我確信這個命令:

e.getElementsItem().get(0).getElementsItemDetails().get(0).getName() 

是錯誤的,但我不知道任何其他方式如何處理名稱值。 ?

當對象名稱的變化(在這種情況下有三個叫這裏提供IDS ids_list的名單Dependance的相似的對象如何表現:[156,831,3125]

請幫

+0

你會得到什麼錯誤? 'new Callback 'vs'Callback ' - 什麼是'ResponseObjectGetDetails'? – William 2015-02-11 22:05:53

+0

對不起@威廉這是一個錯誤。這意味着要回調, – 2015-02-12 08:23:57

+0

你會得到什麼錯誤,究竟是什麼? – William 2015-02-12 18:56:09

回答

8

由於。你ElementItemDetails關鍵是動態生成的,你應該使用一個地圖來表示結構

在模型類元素

更換

public ArrayList<ElementsItem> = new Array<ElementsItem>(); 

Map<String, ElementItemDetails> elemDetails; 

希望這有助於。

+0

這應該是公認的答案。 – Daniel 2016-02-22 17:59:03

+0

感謝您的帖子,它的工作:) – 2017-02-16 08:00:06

+0

工作!多謝,夥計 – 2017-02-22 13:55:40