2015-02-10 70 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