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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 08:55:12