【问题标题】:Retrofit: Handling JSON object that dynamically changes its name改造:处理动态更改其名称的 JSON 对象
【发布时间】:2015-02-10 22:54:25
【问题描述】:

我使用改造。

我有这样的 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);
        }


    });
}

我尝试处理名称“Alex”并在 LogCat 中打印它,但我不能 - 应用程序停止。我确信这个命令:

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

是错误的,但我不知道如何处理名称值。

当对象名称更改时如何表现(在这种情况下,根据提供的 id 列表 ids_list 调用了三个类似的对象?这里:[156,831,3125]

请帮忙。

【问题讨论】:

  • 你得到什么错误? new Callback&lt;Elements&gt; vs Callback&lt;ResponseObjectGetDetails&gt; -- ResponseObjectGetDetails 是什么?
  • 对不起@William 这是一个错误。它本来是 Callback,
  • 你到底得到了什么错误?
  • 失败...java.lang.IndexOutOfBoundsException:无效索引0,大小为0

标签: android json object retrofit


【解决方案1】:

由于ElementItemDetails的key是动态生成的,所以应该使用Map来表示结构。

在您的模型类中元素

替换

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

Map<String, ElementItemDetails> elemDetails;

希望这会有所帮助。

【讨论】:

  • 成功了!谢谢老兄
猜你喜欢
  • 2016-08-22
  • 2017-05-25
  • 1970-01-01
  • 1970-01-01
  • 2022-11-16
  • 2014-08-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多