You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Retrofit调用Newsapi.org时遇Gson接口实例化错误求解决

解决Retrofit+Gson解析NewsAPI时的实例化错误

错误核心原因

你遇到的Unable to invoke no-args constructor for interface javax.xml.transform.Source错误,是因为数据模型(NewsApiResponse或内部的Article类)里,把NewsAPI返回的source字段错误映射成了**javax.xml.transform.Source这个XML相关的接口**。Gson无法直接实例化接口类型,因此抛出异常。

NewsAPI返回的source实际是包含id和name的JSON对象,示例结构如下:

"source": {
  "id": "techcrunch",
  "name": "TechCrunch"
}

解决步骤

1. 创建匹配API结构的自定义Source类

不要使用系统的XML相关Source接口,新建一个对应返回结构的实体类:

package com.example.newapp.Models;

public class Source {
    private String id;
    private String name;

    // 必须保留无参构造方法,Gson依赖它实例化对象
    public Source() {}

    // Getter和Setter方法
    public String getId() { return id; }
    public void setId(String id) { this.id = id; }
    public String getName() { return name; }
    public void setName(String name) { this.name = name; }
}

2. 修改数据模型中的字段类型

找到Article类(属于NewsApiResponse的articles列表),把原来的javax.xml.transform.Source类型字段,替换成上面自定义的Source类:

// 修改前(错误写法)
import javax.xml.transform.Source;
public class Article {
    private Source source;
    // ...其他字段
}

// 修改后(正确写法)
import com.example.newapp.Models.Source;
public class Article {
    private Source source;
    // ...其他字段
}

3. 验证NewsApiResponse结构正确性

确保根数据模型完全匹配API返回的JSON结构,示例如下:

package com.example.newapp.Models;

import java.util.List;

public class NewsApiResponse {
    private String status;
    private int totalResults;
    private List<Article> articles;

    public NewsApiResponse() {}

    // 核心Getter方法,对应你代码中调用的getArticles()
    public List<Article> getArticles() { return articles; }

    // 补充其他字段的Getter和Setter
}

额外优化提示

你的getNewsHeadlines方法传入的category和query参数目前未被使用,如果需要按分类或关键词查询,可修改接口方法添加对应参数(注意NewsAPI的参数名是驼峰格式apiKey):

public interface CallNewsApi {
    @GET("top-headlines")
    Call<NewsApiResponse> callheadlines (
            @Query("sources") String source,
            @Query("category") String category,
            @Query("q") String query,
            @Query("apiKey") String api_key
    );
}

调用时传入对应参数:

Call<NewsApiResponse> call = callNewsApi.callheadlines("techcrunch", category, query, "9d12903806bd47c2b5e70d25cd09c9ca");

内容的提问来源于stack exchange,提问作者Mr.Prince

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 19:10:29