当前位置: 首页 > 知识库问答 >
问题:

改装可观察-应为BEGIN\u数组,但为BEGIN\u对象

戚奇略
2023-03-14

我正在尝试使用《纽约时报》API,并使用Observable进行改装。但我在尝试使用数据时遇到了这个错误。

有人能帮我看看哪里错了吗?

以下是我的ApiServices界面:

@GET("svc/topstories/v2/home.json?api-key=HiddenApiKeyJustForThisMessage")
Observable<TopStoryResult> getTopStories();

@GET("svc/topstories/v2/home.json?api-key=HiddenApiKeyJustForThisMessage")
Observable<List<NewsItem>> getResults();


Retrofit retrofit = new Retrofit.Builder()
        .baseUrl("https://api.nytimes.com/")
        .addConverterFactory(GsonConverterFactory.create(new GsonBuilder().excludeFieldsWithoutExposeAnnotation().create()))
        .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
        .build();

这是我的ApiStreams课

public static Observable<TopStoryResult> streamFetchTopStories(){
    ApiServices mApiServices = ApiServices.retrofit.create(ApiServices.class);
    return mApiServices.getTopStories()
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .timeout(10, TimeUnit.SECONDS);
}

public static Observable<List<NewsItem>> streamFetchNews(){
    ApiServices mApiServices = ApiServices.retrofit.create(ApiServices.class);
    return mApiServices.getResults()
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .timeout(10, TimeUnit.SECONDS);
}

这就是我在我的主要活动中要做的。现在我只想在文本视图中显示每个标题的列表。。。

//------------------------
// Update UI
//------------------------
private void updateUIWhenStartingHttpRequest() {
    this.textView.setText("Downloading...");
}


private void updateUIWhenStopingHttpRequest(String response) {
    this.textView.setText(response);
}



//------------------------
// Rx Java
//------------------------
private void executeRequestWithRetrofit(){
    this.updateUIWhenStartingHttpRequest();

    this.disposable = ApiStreams.streamFetchNews()
            .subscribeWith(new DisposableObserver<List<NewsItem>>(){

                @Override
                public void onNext(List<NewsItem> topStories) {
                    Log.e("TAG", "On Next");
                    updateUIWithResult(topStories);
                }

                @Override
                public void onError(Throwable e) {
                    Log.e("ERROR", Log.getStackTraceString(e));
                }

                @Override
                public void onComplete() {
                    Log.e("TAG", "On Complete !");
                }
            });
}



private void updateUIWithResult(List<NewsItem> newsItemList){
    StringBuilder mStringBuilder = new StringBuilder();
    for (NewsItem news : newsItemList){
        Log.e("TAG", "UPDATE UI" + news.getTitle());
        mStringBuilder.append("- " + news.getTitle() + "\n");
    }
    updateUIWhenStopingHttpRequest(mStringBuilder.toString());
}

[编辑]TopStories和NewsItem有我的两个模型

上部结构:

private String status;
private String copyright;
private String section;
private String lastUpdated;
private Integer numResults;
private List<NewsItem> results = null;

public String getStatus() {return status;
}

public void setStatus(String status) {
    this.status = status;
}

public String getCopyright() {
    return copyright;
}

public void setCopyright(String copyright) {
    this.copyright = copyright;
}

public String getSection() {
    return section;
}

public void setSection(String section) {
    this.section = section;
}

public String getLastUpdated() {
    return lastUpdated;
}

public void setLastUpdated(String lastUpdated) {
    this.lastUpdated = lastUpdated;
}

public Integer getNumResults() {
    return numResults;
}

public void setNumResults(Integer numResults) {
    this.numResults = numResults;
}

public List<NewsItem> getResults() {
    return results;
}

public void setResults(List<NewsItem> results) {
    this.results = results;
}

新闻项目:

 private String section;
private String subsection;
private String title;
private String url;
private String byline;
private String updated_date;
private String created_date;
private String published_date;
private String material_type_facet;
private String kicker;


@SerializedName("abstract")
private String abstract_string;

private List<Multimedia> multimedia;


private transient String des_facet;
private transient String org_facet;
private transient String per_facet;
private transient String geo_facet;

public NewsItem() {
}

public NewsItem(String url) {
    this.url = url;
}

public NewsItem(String section, String subsection, String title, String url, String byline, String updated_date, String created_date, String published_date, String material_type_facet, String kicker) {
    this.section = section;
    this.subsection = subsection;
    this.title = title;
    this.url = url;
    this.byline = byline;
    this.updated_date = updated_date;
    this.created_date = created_date;
    this.published_date = published_date;
    this.material_type_facet = material_type_facet;
    this.kicker = kicker;
}

public String getSection() {
    return section;
}

public void setSection(String section) {
    this.section = section;
}

public String getSubsection() {
    return subsection;
}

public void setSubsection(String subsection) {
    this.subsection = subsection;
}

public String getTitle() {
    return title;
}

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

public String getUrl() {
    return url;
}

public void setUrl(String url) {
    this.url = url;
}

public String getByline() {
    return byline;
}

public void setByline(String byline) {
    this.byline = byline;
}

public String getUpdated_date() {
    return updated_date;
}

public void setUpdated_date(String updated_date) {
    this.updated_date = updated_date;
}

public String getCreated_date() {
    return created_date;
}

public void setCreated_date(String created_date) {
    this.created_date = created_date;
}

public String getPublished_date() {
    return published_date;
}

public void setPublished_date(String published_date) {
    this.published_date = published_date;
}

public String getMaterial_type_facet() {
    return material_type_facet;
}

public void setMaterial_type_facet(String material_type_facet) {
    this.material_type_facet = material_type_facet;
}

public String getKicker() {
    return kicker;
}

public void setKicker(String kicker) {
    this.kicker = kicker;
}


public String getAbstract() {
    return abstract_string;
}

public void setAbstract(String abstract_string) {
    this.abstract_string = abstract_string;
}

public List<Multimedia> getMultimedia() {
    return multimedia;
}

public void setMultimedia(List<Multimedia> multimedia) {
    this.multimedia = multimedia;
}

public String getDes_facet() {
    return des_facet;
}

public void setDes_facet(String des_facet) {
    this.des_facet = des_facet;
}

public String getOrg_facet() {
    return org_facet;
}

public void setOrg_facet(String org_facet) {
    this.org_facet = org_facet;
}

public String getPer_facet() {
    return per_facet;
}

public void setPer_facet(String per_facet) {
    this.per_facet = per_facet;
}

public String getGeo_facet() {
    return geo_facet;
}

public void setGeo_facet(String geo_facet) {
    this.geo_facet = geo_facet;
}

以下是JSON的外观:

JSON

首先,当我用Github用户API尝试这一点时,它工作得很好。但我不知道我错在哪里。。。

有人能帮我吗?

非常感谢!

共有2个答案

强金鑫
2023-03-14

在ApiServices界面中,您希望getResults()返回可观察的

您必须使用List的“结果”字段类型创建新的包装类(ResultsWrapper)

@GET("svc/topstories/v2/home.json?api-key=HiddenApiKeyJustForThisMessage")
Observable<ResultsWrapper> getResults();

这就是“预期BEGIN_ARRAY但BEGIN_OBJECT”对你说的。

时经纬
2023-03-14

预期BEGIN_ARRAY但BEGIN_OBJECT这意味着您正在尝试将JSON数组作为JAVA中的列表,但api向您发送了一个JSON对象。所以我无法收集足够的信息,但如果我不得不猜测您应该更改它

@GET("svc/topstories/v2/home.json?api-key=HiddenApiKeyJustForThisMessage")
Observable<List<NewsItem>> getResults();

@GET("svc/topstories/v2/home.json?api-key=HiddenApiKeyJustForThisMessage")
Observable<NewsItemObject> getResults();

NewsItemObject是包装NewsItem的类

 类似资料:
  • 我从以下改装服务中获得了一个json结果: 我在改装后变得像bellow一样: 但是告诉我: 下面是我的模型:

  • 这是我的JSON数据: 这是我的反序列化代码: 我在PageSecurity上收到错误。这是我的PageResponce类。我想我可能处理信息是正确的。我只使用过JsonObject。我想知道如何获取“page”: 0,然后如何获取“线程” } 我的页面类 公共类页面{ }

  • 我有下面的JSON和模型类,如何使用GSOn反序列化这个JSON,下面的代码片段会出现类似“预期的BEGIN\u对象,但是BEGIN\u数组”的异常。如何为下面的JSON数据生成模型CALS

  • 我有这样的json。在我的情况下,当我单击一个产品时,我会将该产品交给detailproduct。在那之后,我在我的详细信息屏幕中有了回收器。我想按产品数组获取回收商项目,该数组的id等于单击的产品id。 我想了解产品阵列。我的api方法正在返回调用

  • 从Android改型读取JSON字符串时出现问题。

  • 我有如下JSON文件http://sawbo-illinois.org/mobileApp.php . 我已将对象创建为: 但是当我像这样跟着的时候,我得到了改造失败的回应。我的问题在哪里? 我的完整代码是: 改造界面: 可能回调和转换过程: