Java 无法使用改装和GSON解析JSON-堆栈溢出
我在尝试改型来解析我的JSON时遇到了很多麻烦,我无法理解。每当我运行改装代码时,我都会遇到崩溃:Java 无法使用改装和GSON解析JSON-堆栈溢出,java,json,retrofit,Java,Json,Retrofit,我在尝试改型来解析我的JSON时遇到了很多麻烦,我无法理解。每当我运行改装代码时,我都会遇到崩溃: Caused by: java.lang.StackOverflowError: stack size 1036KB at com.google.gson.internal.$Gson$Types$WildcardTypeImpl.<init>($Gson$Types.java:537) 我的JSON如下所示: { "199" : { "annconten
Caused by: java.lang.StackOverflowError: stack size 1036KB
at com.google.gson.internal.$Gson$Types$WildcardTypeImpl.<init>($Gson$Types.java:537)
我的JSON如下所示:
{
"199" : {
"anncontent" : "content",
"anndisplaydate" : "Tuesday February 11",
"announcements_id" : "199",
"anntitle" : "Newsletter Issue 17"
},
"264" : {
"anncontent" : "content",
"anndate" : "2014-10-03 22:37:32",
"anndisplaydate" : "Friday October 03",
"announcements_id" : "264",
"anntitle" : "Timetable"
},
"267" : {
"anncontent" : "content",
"anndate" : "2014-10-10 02:41:32",
"anndisplaydate" : "Friday October 10",
"announcements_id" : "267",
"anntitle" : "Author talk with Hugh O’Brien"
}
}
private String anntitle;
private String anncontent;
private String anndisplaydate;
private Date anndate;
private String announcements_id;
public interface AnnouncementsAPI {
@GET("/announcements.json")
ArrayList<Announcement> listAnnouncements();}
RestAdapter restAdapter = new RestAdapter.Builder()
.setEndpoint("https://MYURL")
.build();
AnnouncementsAPI announcementsAPI = restAdapter.create(AnnouncementsAPI.class);
ArrayList<Announcement> announcements = announcementsAPI.listAnnouncements();
Log.d("RETROFIT", "Announcemnts: " + announcements.toString());
我的公告类字段如下所示:
{
"199" : {
"anncontent" : "content",
"anndisplaydate" : "Tuesday February 11",
"announcements_id" : "199",
"anntitle" : "Newsletter Issue 17"
},
"264" : {
"anncontent" : "content",
"anndate" : "2014-10-03 22:37:32",
"anndisplaydate" : "Friday October 03",
"announcements_id" : "264",
"anntitle" : "Timetable"
},
"267" : {
"anncontent" : "content",
"anndate" : "2014-10-10 02:41:32",
"anndisplaydate" : "Friday October 10",
"announcements_id" : "267",
"anntitle" : "Author talk with Hugh O’Brien"
}
}
private String anntitle;
private String anncontent;
private String anndisplaydate;
private Date anndate;
private String announcements_id;
public interface AnnouncementsAPI {
@GET("/announcements.json")
ArrayList<Announcement> listAnnouncements();}
RestAdapter restAdapter = new RestAdapter.Builder()
.setEndpoint("https://MYURL")
.build();
AnnouncementsAPI announcementsAPI = restAdapter.create(AnnouncementsAPI.class);
ArrayList<Announcement> announcements = announcementsAPI.listAnnouncements();
Log.d("RETROFIT", "Announcemnts: " + announcements.toString());
我的界面如下所示:
{
"199" : {
"anncontent" : "content",
"anndisplaydate" : "Tuesday February 11",
"announcements_id" : "199",
"anntitle" : "Newsletter Issue 17"
},
"264" : {
"anncontent" : "content",
"anndate" : "2014-10-03 22:37:32",
"anndisplaydate" : "Friday October 03",
"announcements_id" : "264",
"anntitle" : "Timetable"
},
"267" : {
"anncontent" : "content",
"anndate" : "2014-10-10 02:41:32",
"anndisplaydate" : "Friday October 10",
"announcements_id" : "267",
"anntitle" : "Author talk with Hugh O’Brien"
}
}
private String anntitle;
private String anncontent;
private String anndisplaydate;
private Date anndate;
private String announcements_id;
public interface AnnouncementsAPI {
@GET("/announcements.json")
ArrayList<Announcement> listAnnouncements();}
RestAdapter restAdapter = new RestAdapter.Builder()
.setEndpoint("https://MYURL")
.build();
AnnouncementsAPI announcementsAPI = restAdapter.create(AnnouncementsAPI.class);
ArrayList<Announcement> announcements = announcementsAPI.listAnnouncements();
Log.d("RETROFIT", "Announcemnts: " + announcements.toString());
公共界面公告SAPI{
@获取(“/announcements.json”)
ArrayList listAnnouncements();}
最后,我的改装代码如下所示:
{
"199" : {
"anncontent" : "content",
"anndisplaydate" : "Tuesday February 11",
"announcements_id" : "199",
"anntitle" : "Newsletter Issue 17"
},
"264" : {
"anncontent" : "content",
"anndate" : "2014-10-03 22:37:32",
"anndisplaydate" : "Friday October 03",
"announcements_id" : "264",
"anntitle" : "Timetable"
},
"267" : {
"anncontent" : "content",
"anndate" : "2014-10-10 02:41:32",
"anndisplaydate" : "Friday October 10",
"announcements_id" : "267",
"anntitle" : "Author talk with Hugh O’Brien"
}
}
private String anntitle;
private String anncontent;
private String anndisplaydate;
private Date anndate;
private String announcements_id;
public interface AnnouncementsAPI {
@GET("/announcements.json")
ArrayList<Announcement> listAnnouncements();}
RestAdapter restAdapter = new RestAdapter.Builder()
.setEndpoint("https://MYURL")
.build();
AnnouncementsAPI announcementsAPI = restAdapter.create(AnnouncementsAPI.class);
ArrayList<Announcement> announcements = announcementsAPI.listAnnouncements();
Log.d("RETROFIT", "Announcemnts: " + announcements.toString());
RestAdapter RestAdapter=new RestAdapter.Builder()
.setEndpoint(“https://MYURL")
.build();
AnnouncementsAPI AnnouncementsAPI=restAdapter.create(AnnouncementsAPI.class);
ArrayList announcements=announcementsAPI.listAnnouncements();
Log.d(“改装”、“公告mnts:+announces.toString());
我只是想得到一个公告对象的ArrayList,我不知道该怎么做。如果以前有人问过这个问题,我很抱歉,但是我发现前面的所有问题/示例都使用了JSON,这与我的问题/示例似乎有很大的不同
如果有人有任何想法,我将不胜感激。
谢谢尝试为您的界面使用
改装回调
,如下所示:
界面
public interface AnnouncementsAPI {
@GET("/announcements.json")
void listAnnouncements(Callback<ListAnnouncement> callback);
}
RestAdapter restAdapter = new RestAdapter.Builder()
.setEndpoint("https://MYURL")
.build();
AnnouncementsAPI announcementsAPI = restAdapter.create(AnnouncementsAPI.class);
final ListAnnouncement listAnnouncement;
announcementsAPI.listAnnouncements(new Callback<ListAnnouncement>() {
@Override
public void success(ListAnnouncement data, Response response) {
listAnnouncement = data;
}
@Override
public void failure(RetrofitError error) {
}
}
);
公共界面公告SAPI{
@获取(“/announcements.json”)
作废列表公告(回调);
}
如果希望返回为列表,请将announcement类封装到另一个类中,如下所示:
ListAnnouncement.Java
public class ListAnnouncement {
private List<Announcement> fieldname; //match the fieldname with the field name on the JSON
//add getter-setter as needed
}
公共类列表公告{
private List fieldname;//将字段名与JSON上的字段名匹配
//根据需要添加getter setter
}
改装代码
public interface AnnouncementsAPI {
@GET("/announcements.json")
void listAnnouncements(Callback<ListAnnouncement> callback);
}
RestAdapter restAdapter = new RestAdapter.Builder()
.setEndpoint("https://MYURL")
.build();
AnnouncementsAPI announcementsAPI = restAdapter.create(AnnouncementsAPI.class);
final ListAnnouncement listAnnouncement;
announcementsAPI.listAnnouncements(new Callback<ListAnnouncement>() {
@Override
public void success(ListAnnouncement data, Response response) {
listAnnouncement = data;
}
@Override
public void failure(RetrofitError error) {
}
}
);
RestAdapter RestAdapter=new RestAdapter.Builder()
.setEndpoint(“https://MYURL")
.build();
AnnouncementsAPI AnnouncementsAPI=restAdapter.create(AnnouncementsAPI.class);
最终清单公告;
announcementsAPI.listAnnounces(新回调(){
@凌驾
public void成功(列表公告数据、响应){
listAnnouncement=数据;
}
@凌驾
公共无效失败(错误){
}
}
);
之后,您可以使用列表公告
类
上的字段名
来获取公告
的列表
重要
如果您的JSON确实是一个
JSON数组
,那么上面的代码就可以工作了。从外观上看,您得到了几个具有不同键的Announcement
对象的返回,这不是一个JSON数组
如果所有对象都扩展了相同的基本对象,那么StackOverflower错误:堆栈大小1036KB异常发生
例如:
classbasebean
A类扩展了BaseBean
(A类
包含A类
和B类
的引用)B类扩展了BaseBean
C类扩展了BaseBean
实施上述情况,发生相同异常的可能性很大。(不要使用BaseBean进行扩展)。试试这个。响应应该是这种格式的
HashMap
,看起来我有一个非常类似的问题。你知道出了什么问题吗?