Java 我能’;t从嵌入json的数组中获取数据。使用改装和GSON

Java 我能’;t从嵌入json的数组中获取数据。使用改装和GSON,java,android,json,gson,retrofit,Java,Android,Json,Gson,Retrofit,我已经尝试从“内容”数组获取数据好几天了,但是我得到了一个空响应 我的JSON: { "Magazines":[ { "Title":"someTitle", "Year":"2019", "Description":"someDescription", "Type":"anyType", "Cover":"http://img.timeinc.net/time/magazine/arch

我已经尝试从“内容”数组获取数据好几天了,但是我得到了一个空响应

我的JSON:

{
   "Magazines":[
      {
         "Title":"someTitle",
         "Year":"2019",
         "Description":"someDescription",
         "Type":"anyType",
         "Cover":"http://img.timeinc.net/time/magazine/archive/covers/1956/1101560514_400.jpg",
         "Info":"infoAboutMagazine",
         "Content":[
            {
               "ArticleTitle":"someArticleTitle",
               "ArticlePrice":"101$"
            },
            {
               "ArticleTitle":"1.2)someArticleTitle",
               "ArticlePrice":"102$"
            },
            {
               "ArticleTitle":"1.3)someArticleTitle",
               "ArticlePrice":"103$"
            }
         ]
      },
      {
        "Title":"someTitle2",
        ...
        "Content":[{
          ...
         }] 
       }
             ]
     }
我的波乔

-----------------------------------Content.java-----------------------------------



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

public class Content {

@SerializedName("ArticleTitle")
@Expose
private String articleTitle;
@SerializedName("ArticlePrice")
@Expose
private String articlePrice;

public String getArticleTitle() {
return articleTitle;
}

public void setArticleTitle(String articleTitle) {
this.articleTitle = articleTitle;
}

public String getArticlePrice() {
return articlePrice;
}

public void setArticlePrice(String articlePrice) {
this.articlePrice = articlePrice;
}

}
-----------------------------------Magazines.java-----------------------------------


import java.util.List;
import com.google.gson.annotations.Expose;
import com.google.gson.annotations.SerializedName;

public class Magazines {

@SerializedName("Magazines")
@Expose
private List<Magazine> magazines = null;

public List<Magazine> getMagazines() {
return magazines;
}

public void setMagazines(List<Magazine> magazines) {
this.magazines = magazines;
}

}
-----------------------------------Magazine.java-----------------------------------


import java.util.List;
import com.google.gson.annotations.Expose;
import com.google.gson.annotations.SerializedName;

public class Magazine {

@SerializedName("Title")
@Expose
private String title;
@SerializedName("Year")
@Expose
private String year;
@SerializedName("Description")
@Expose
private String description;
@SerializedName("Type")
@Expose
private String type;
@SerializedName("Cover")
@Expose
private String cover;
@SerializedName("Info")
@Expose
private String info;
@SerializedName("Content")
@Expose
private List<Content> content = null;

public String getTitle() {
return title;
}

public void setTitle(String title) {
this.title = title;
}

public String getYear() {
return year;
}

public void setYear(String year) {
this.year = year;
}

public String getDescription() {
return description;
}

public void setDescription(String description) {
this.description = description;
}

public String getType() {
return type;
}

public void setType(String type) {
this.type = type;
}

public String getCover() {
return cover;
}

public void setCover(String cover) {
this.cover = cover;
}

public String getInfo() {
return info;
}

public void setInfo(String info) {
this.info = info;
}

public List<Content> getContent() {
return content;
}

public void setContent(List<Content> content) {
this.content = content;
}

}
和Api杂志

public class ApiMagazine {
    private static ApiMagazine apiMagazine;
    private static Retrofit retrofit;
    private static final String BASE_URL = "http://test.satird.ru/";

    private ApiMagazine() {
        retrofit = new Retrofit.Builder()
                .addConverterFactory(GsonConverterFactory.create())
                .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
                .baseUrl(BASE_URL)
                .build();
    }
    public static ApiMagazine getInstance() {
        if (apiMagazine == null) {
            apiMagazine = new ApiMagazine();
        }
        return apiMagazine;
    }
    public ApiService getApiService() {
        return retrofit.create(ApiService.class);
    }
}

您的API服务实现是错误的。它不会给你
杂志
内容
。它实际上总是给你杂志

@GET("test.json")  
Observable<Magazines> getMagazines();

可以再做一点吗?尝试通过构造函数传递列表。在showDataContent()方法中添加断点并检查列表的大小。在showDataContent()中添加断点时,返回内容:null,但为什么?API代码在哪里?添加
apiService.getMagazine()
implementation对于误导当前POJO,我深表歉意。为了不从单独的类中收集部分代码,我在中删除了JSON,只是从中复制了数据,忘记了替换我在项目中使用的当前数据。现在我编辑到当前状态。你能更详细地解释为什么对所有数据使用一个api是不好的吗?检查我的答案谢谢)你的答案有效!但是,显然,由于
.get(0)
的成本,结果返回第一本杂志的“内容”数据。这能打吗?是的,我会将你的答案标记为解决方案,再次感谢!你想要什么?一次完成所有内容?我会解释我需要什么。我得到了一个杂志列表的嵌套JSON。在第一级,JSON是标题、年份等。第二级是包含articleTitle和priceArticle的内容。在第一个活动中,我显示了一个带有封面和杂志名称的杂志列表(使用recyclerview),在下一个活动中,我从单击的杂志中传输数据——第一个JSON附件中的描述、信息和其他数据。最后,在第三个活动中,我使用“内容”中的数据创建了处理器的新视图,即articleTitle和articlePrice。
public class ContentListPresenter {
    private CompositeDisposable compositeDisposable;
    private ContentListView view;

    public ContentListPresenter(ContentListView view) {
        this.view = view;
    }
    public void loadDateContent() {
        ApiMagazine apiMagazine = ApiMagazine.getInstance();
        ApiService apiService = apiMagazine.getApiService();
        compositeDisposable = new CompositeDisposable();
        Disposable disposable = apiService.getContent()
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Consumer<Magazine>() {
                    @Override
                    public void accept(Magazine magazine) throws Exception {
                        view.showDataContent(magazine.getContent());
                    }
                }, new Consumer<Throwable>() {
                    @Override
                    public void accept(Throwable throwable) throws Exception {
                        view.showError();
                    }
                });
        compositeDisposable.add(disposable);
    }

    public void disposeDisposable() {
        if (compositeDisposable != null) {
            compositeDisposable.dispose();
        }
    }
}
public interface ContentListView {
    void showDataContent(List<Content> content);
    void showError();
}
public interface ApiService {
    @GET("test.json")
    Observable<Magazine> getContent();
    @GET("test.json")
    Observable<Magazines> getMagazines();
}
public class ApiMagazine {
    private static ApiMagazine apiMagazine;
    private static Retrofit retrofit;
    private static final String BASE_URL = "http://test.satird.ru/";

    private ApiMagazine() {
        retrofit = new Retrofit.Builder()
                .addConverterFactory(GsonConverterFactory.create())
                .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
                .baseUrl(BASE_URL)
                .build();
    }
    public static ApiMagazine getInstance() {
        if (apiMagazine == null) {
            apiMagazine = new ApiMagazine();
        }
        return apiMagazine;
    }
    public ApiService getApiService() {
        return retrofit.create(ApiService.class);
    }
}
@GET("test.json")  
Observable<Magazines> getMagazines();
public void loadDateContent() {
    ApiMagazine apiMagazine = ApiMagazine.getInstance();
    ApiService apiService = apiMagazine.getApiService();
    compositeDisposable = new CompositeDisposable();
    Disposable disposable = apiService.getMagazines()
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(new Consumer<Magazines>() {
                @Override
                public void accept(Magazines magazines) throws Exception {
                    //This will return Contents [1.*] of first Magazine [Акушерство и геникология]
                    List<Content> contents = magazines.getMagazines().get(0).getContent();
                    view.showDataContent(contents);
                }
            }, new Consumer<Throwable>() {
                @Override
                public void accept(Throwable throwable) throws Exception {
                    view.showError();
                }
            });
    compositeDisposable.add(disposable);
}