JSON解析数据创建对象:无法将新闻数据存入NewsModel类
解决JSON解析数据无法存入NewsModel类的问题
我来帮你排查这个问题!结合你描述的情况——手动添加数据能正常在ListView展示,但解析后的JSON数据存不进NewsModel类,大概率是这几个常见原因,咱们一步步来解决:
1. 检查NewsModel字段与JSON返回的匹配度
这是最容易踩的坑:你的NewsModel类的字段名、大小写必须和API返回的JSON字段完全一致(JSON是大小写敏感的)。比如API返回的是"name",你就不能写成newsName或者Name。
给你一个标准的NewsModel示例(假设API返回字段就是name、author、title):
public class NewsModel { // 字段名必须和JSON返回的完全匹配 private String name; private String author; private String title; // 必须保留空构造方法(Gson、FastJson等解析库依赖它实例化对象) public NewsModel() {} // 带参构造,方便手动添加测试数据 public NewsModel(String name, String author, String title) { this.name = name; this.author = author; this.title = title; } // 必须添加Getter和Setter方法,Adapter需要通过这些方法获取数据 public String getName() { return name; } public void setName(String name) { this.name = name; } public String getAuthor() { return author; } public void setAuthor(String author) { this.author = author; } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } }
2. 排查JSON解析的逻辑是否正确
你说JSON解析已成功,但可能是没正确从JSON中提取字段并赋值给NewsModel对象。这里分两种常见解析方式说明:
方式一:原生JSONObject/JSONArray解析
如果用原生API解析,要确保正确遍历JSON结构,并把字段赋值给NewsModel:
// 假设已拿到API返回的JSON字符串jsonResponse try { JSONArray newsArray = new JSONArray(jsonResponse); ArrayList<NewsModel> newsList = new ArrayList<>(); for (int i = 0; i < newsArray.length(); i++) { JSONObject newsObj = newsArray.getJSONObject(i); // 用optString代替getString,避免字段为null时崩溃 String name = newsObj.optString("name"); String author = newsObj.optString("author"); String title = newsObj.optString("title"); // 实例化NewsModel并加入列表 NewsModel news = new NewsModel(name, author, title); newsList.add(news); } // 和手动添加数据的逻辑一致,把列表传给Adapter NewsAdapter adapter = new NewsAdapter(this, newsList); listView.setAdapter(adapter); } catch (JSONException e) { e.printStackTrace(); }
方式二:Gson第三方库解析
如果用Gson,要注意用TypeToken指定数组类型,避免解析错误:
// 先添加Gson依赖(若未添加):implementation 'com.google.code.gson:gson:2.10.1' String jsonResponse = "你的API返回JSON字符串"; Gson gson = new Gson(); // 用TypeToken明确指定ArrayList<NewsModel>的类型 Type newsListType = new TypeToken<ArrayList<NewsModel>>() {}.getType(); ArrayList<NewsModel> newsList = gson.fromJson(jsonResponse, newsListType); // 绑定Adapter到ListView NewsAdapter adapter = new NewsAdapter(this, newsList); listView.setAdapter(adapter);
3. 确认Adapter的数据更新逻辑
如果前面两步都没问题,要检查以下几点:
- 不要在解析后执行
newsList = new ArrayList<>();这类代码,会清空刚解析的数据 - 如果是在子线程做网络请求和解析,必须切换到主线程更新UI(Android要求UI操作在主线程):
runOnUiThread(() -> { NewsAdapter adapter = new NewsAdapter(MainActivity.this, newsList); listView.setAdapter(adapter); });
4. 额外排查小技巧
- 检查API返回的JSON结构:如果新闻数据嵌套在
{"data": [新闻对象数组]}里,要先解析出data对应的JSONArray再遍历 - 打印日志验证:解析后打印
newsList.size(),或者打印某个NewsModel的字段值,确认数据是否真的被存入了Model
内容的提问来源于stack exchange,提问作者iosdev
相关产品推荐
相关产品推荐

