使用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
相关产品推荐
相关产品推荐

