Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 无法使用改装和GSON解析JSON-堆栈溢出_Java_Json_Retrofit - Fatal编程技术网

Java 无法使用改装和GSON解析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

我在尝试改型来解析我的JSON时遇到了很多麻烦,我无法理解。每当我运行改装代码时,我都会遇到崩溃:

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

,看起来我有一个非常类似的问题。你知道出了什么问题吗?