获得嵌套的JsonObjects&使用Retrofit库的数组

时间:2016-03-14 19:28:42

标签: android json retrofit

我厌倦了使用这个库,这是我第一次使用它并取得了很多成功的方法,但是我对获得以下Json有点困惑:

&

用Google搜索并看到很多指南并回答,然后像我一样制作了我的列表:

&

我的模特:

{
  "Guides":
            {
            "English":    {"ArabicSony":"Test1","ArabicNexus":"Test2","ArabicSamsung":"Test3","ArabicHTC":"Test4"}
            ,"Arabic":    {"EnglishSony":"Test1","EnglishNexus":"Test2","EnglishSamsung":"Test3","EnglishHTC":"Test4"}
            }

}

打印结果如下:

public class PostItem {

List<PostItemArabic> Arabic;
List<PostItemEnglish> English;

}

class PostItemArabic{

private String ArabicSony;
private String ArabicNexus;
private String ArabicSamsung;
private String ArabicHTC;

public String getArabicSony() {
    return ArabicSony;
}

public void setArabicSony(String arabicSony) {
    ArabicSony = arabicSony;
}

public String getArabicNexus() {
    return ArabicNexus;
}

public void setArabicNexus(String arabicNexus) {
    ArabicNexus = arabicNexus;
}

public String getArabicSamsung() {
    return ArabicSamsung;
}

public void setArabicSamsung(String arabicSamsung) {
    ArabicSamsung = arabicSamsung;
}

public String getArabicHTC() {
    return ArabicHTC;
}

public void setArabicHTC(String arabicHTC) {
    ArabicHTC = arabicHTC;
}

}

class PostItemEnglish{

private String EnglishSony;
private String EnglishNexus;
private String EnglishSamsung;
private String EnglishHTC;

public String getEnglishSony() {
    return EnglishSony;
}

public void setEnglishSony(String englishSony) {
    EnglishSony = englishSony;
}

public String getEnglishNexus() {
    return EnglishNexus;
}

public void setEnglishNexus(String englishNexus) {
    EnglishNexus = englishNexus;
}

public String getEnglishSamsung() {
    return EnglishSamsung;
}

public void setEnglishSamsung(String englishSamsung) {
    EnglishSamsung = englishSamsung;
}

public String getEnglishHTC() {
    return EnglishHTC;
}

public void setEnglishHTC(String englishHTC) {
    EnglishHTC = englishHTC;
}
}

我的工作不正确,并且收到很多错误,

这是我收到的最后一个错误:

    private class Model {
    private List<PostItem> Guides;

    public List<PostItem> getGuides() {
        return Guides;
    }

    public void setGuides(List<PostItem> roms_center) {
        this.Guides = roms_center;
    }

}

让它正确的方法是什么? `

2 个答案:

答案 0 :(得分:0)

根据您的模型,当您尝试获取指南列表时,您需要进行改进以填充数组。然后Retrofit获取数据并发现它是单个对象而不是数组。因此,您需要更新模型以反映返回的数据。例如:

class PostItem {
   List<Language> mLanguages;
} 

class Language{
   String mLanguageTitle; //for example english
   List<String> mData; //for this is your list of data
}

然后在您的活动中,而不是获取指南,您将只获得一个帖子项目,例如:

response.body().getPostItem();

希望它有所帮助!

答案 1 :(得分:0)

首先,您可以使用改装的Gson库。

您可以通过两种方式处理此问题:

选项1:将您的语言重新格式化为json,就像Doug所说的那样。

{

"Guides":
        [
        {"Lang":"English","ArabicSony":"Test1","ArabicNexus":"Test2","ArabicSamsung":"Test3","ArabicHTC":"Test4"}
        ,   {"Lang":"Arabic","EnglishSony":"Test1","EnglishNexus":"Test2","EnglishSamsung":"Test3","EnglishHTC":"Test4"}
        ]

   }

然后,您需要重新设计您的课程以反映此结构。 像道格说:

 class PostItem {
     List<Language> mLanguages;
 } 

选项2:在班级中创建自定义json desirializer。这将采取Json并将其分解为您想要的任何结构。

public class PostItem implements JsonDeserializer

@Override
public MyDesirializer deserialize(JsonElement json, Type type,
    JsonDeserializationContext context) throws JsonParseException {

    JsonObject jarabic = (JsonObject) json.get("Arabic");
    //whatever manipulations you want to do (fill with your own code)
    PostItem item = new PostItem();
    item.arabic = jarabic;
    ...
    ...

    return item;
}