繁体   English   中英

带有Gson和改型的Java的Json错误[预期BEGIN_ARRAY但在第1行第70列$ .Data处为BEGIN_OBJECT。

[英]Json error for Java with Gson and retrofit [Expected BEGIN_ARRAY but was BEGIN_OBJECT at line 1 column 70 path $.Data]

我正在使用有关CryptoCompare的有关加密货币新闻的API。 我的问题是我无法检测到我的代码错误是什么。

错误如下-> com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_ARRAY but was BEGIN_OBJECT at line 1 column 70 path $.Data

我复制了Json和我的两个类,以帮助我找到解决方案。

杰森:

 {
  "Type": 100,
  "Message": "News list successfully returned",
  "Promoted": [

  ],
  "Data": [
    {
      "id": "2940487",
      "guid": "https://cointelegraph.com/news/australian-hacker-pleads-guilty-to-stealing-450-000-in-xrp-last-year",
      "published_on": 1566590880,
      "imageurl": "https://images.cryptocompare.com/news/cointelegraph/dj0O90McM86.png",
      "title": "Australian Hacker Pleads Guilty to Stealing $450,000 in XRP Last Year",
      "url": "https://cointelegraph.com/news/australian-hacker-pleads-guilty-to-stealing-450-000-in-xrp-last-year",
      "source": "cointelegraph",
      "body": "An Australian woman has pleaded guilty to stealing $450,000 in XRP",
      "tags": "Altcoin|Australia|Fraud|Hackers|XRP|Tokens|Police",
      "categories": "XRP|ICO|Altcoin",
      "upvotes": "0",
      "downvotes": "0",
      "lang": "EN",
      "source_info": {
        "name": "CoinTelegraph",
        "lang": "EN",
        "img": "https://images.cryptocompare.com/news/default/cointelegraph.png"
      }
    },

]

api的链接-> https://min-api.cryptocompare.com/data/v2/news/?lang=EN

Java类新闻:

public class News {

@SerializedName("Type")
@Expose
private Integer type;
@SerializedName("Message")
@Expose
private String message;

@SerializedName("Data")
@Expose
private List<Article> articles = null;

@SerializedName("HasWarning")
@Expose
private Boolean hasWarning;

public Integer getType() {
    return type;
}

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

public String getMessage() {
    return message;
}

public void setMessage(String message) {
    this.message = message;
}

public List<Article> getArticles() {
    return articles;
}

public void setArticles(List<Article> articles) {
    this.articles = articles;
}

public Boolean getHasWarning() {
    return hasWarning;
}

public void setHasWarning(Boolean hasWarning) {
    this.hasWarning = hasWarning;
}

Java类文章:

public class Article {

@SerializedName("id")
@Expose
private String id;
@SerializedName("guid")
@Expose
private String guid;
@SerializedName("published_on")
@Expose
private Integer publishedOn;
@SerializedName("imageurl")
@Expose
private String imageurl;
@SerializedName("title")
@Expose
private String title;
@SerializedName("url")
@Expose
private String url;
@SerializedName("source")
@Expose
private String source;
@SerializedName("body")
@Expose
private String body;
@SerializedName("tags")
@Expose
private String tags;
@SerializedName("categories")
@Expose
private String categories;
@SerializedName("upvotes")
@Expose
private String upvotes;
@SerializedName("downvotes")
@Expose
private String downvotes;
@SerializedName("lang")
@Expose
private String lang;

public String getId() {
    return id;
}

public void setId(String id) {
    this.id = id;
}

public String getGuid() {
    return guid;
}

public void setGuid(String guid) {
    this.guid = guid;
}

public Integer getPublishedOn() {
    return publishedOn;
}

public void setPublishedOn(Integer publishedOn) {
    this.publishedOn = publishedOn;
}

public String getImageurl() {
    return imageurl;
}

public void setImageurl(String imageurl) {
    this.imageurl = imageurl;
}

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 getSource() {
    return source;
}

public void setSource(String source) {
    this.source = source;
}

public String getBody() {
    return body;
}

public void setBody(String body) {
    this.body = body;
}

public String getTags() {
    return tags;
}

public void setTags(String tags) {
    this.tags = tags;
}

public String getCategories() {
    return categories;
}

public void setCategories(String categories) {
    this.categories = categories;
}

public String getUpvotes() {
    return upvotes;
}

public void setUpvotes(String upvotes) {
    this.upvotes = upvotes;
}

public String getDownvotes() {
    return downvotes;
}

public void setDownvotes(String downvotes) {
    this.downvotes = downvotes;
}

public String getLang() {
    return lang;
}

public void setLang(String lang) {
    this.lang = lang;
}

}

调用Api的接口:

public interface ApiInterface {
    @GET("news")
    Call<News> getNews(
            @Query("lang") String lang,
            @Query("api_key") String apiKey,
            @Query("lTs") int lTs

    );

改造类生成器

public static Retrofit getApiClient(String BASE_URL){


            retrofit = new Retrofit.Builder().baseUrl(BASE_URL)
                    .client(getUnsafeOkHttpClient().build())
                    .addConverterFactory(GsonConverterFactory.create())
                    .build();


        return retrofit;
    }

我调用api时的代码片段

private void LoadJson(){
        swipeRefreshLayout.setRefreshing(true);
        final ApiInterface apiInterface = ApiClient.getApiClient(ApiUtils.BASE_URL_NEWS).create(ApiInterface.class);

        Call<News> call;

        call = apiInterface.getNews("EN", ApiUtils.API_KEY,0);

        call.enqueue(new Callback<News>() {
            @Override
            public void onResponse(Call<News> call, Response<News> response) {
                if (response.isSuccessful() && response.body() != null){
                    articles.addAll(response.body().getArticles());
                    if (articles.size() - response.body().getArticles().size() == 0){
                        adapterNews.notifyDataSetChanged();
                    } else {
                        adapterNews.notifyItemRangeInserted(articles.size() - response.body().getArticles().size(), response.body().getArticles().size());
                    }


                    swipeRefreshLayout.setRefreshing(false);

                    progressBar.setVisibility(View.GONE);

                } else {
                    Toast.makeText(getContext(), "No result", Toast.LENGTH_SHORT).show();
                    swipeRefreshLayout.setRefreshing(false);

                    progressBar.setVisibility(View.GONE);

                }
            }

            @Override
            public void onFailure(Call<News> call, Throwable t) {
                Log.e(TAG, "ERROR API: " + t.getMessage() + " - " + t.getCause());


            }
        });
    }

任何贡献都是非常有帮助的。

谢谢

解决了问题

我注意到当您尝试使用错误的值对api进行查询时,像这样

https://min-api.cryptocompare.com/data/v2/news/?lang=zh-CN

给你json而不是array数据,所以这会产生错误

为了进行修复和测试,而不是Locale.getDefault().getLanguage()仅使用“ EN”并检查结果

还需要更多帮助,您可以使用此日志记录拦截器

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM