Java 我能’;t从嵌入json的数组中获取数据。使用改装和GSON
我已经尝试从“内容”数组获取数据好几天了,但是我得到了一个空响应 我的JSON: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
{
"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);
}