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

Component.onCompleted加载JSON到QML ListView报错及无数据排查

问题排查与解决

常见问题点及修复方案

1. JSON未正确解析为可识别的Model结构

QML的ListView无法直接识别原始JSON字符串,必须先将其解析为JavaScript数组或ListModel对象。如果直接把JSON字符串赋值给model,委托里访问code/name时就会找不到对应属性,触发ReferenceError。

修复示例:

ListView {
    id: listView
    width: 200
    height: 400

    delegate: Text { text: model.code + " - " + model.name }

    Component.onCompleted: {
        // 示例JSON字符串
        let jsonStr = '[{"code":"001","name":"测试1"},{"code":"002","name":"测试2"}]';
        // 解析为JS数组
        let dataArray = JSON.parse(jsonStr);
        // 赋值给ListView的model
        listView.model = dataArray;
    }
}

2. 委托中属性引用方式错误

如果委托里直接写text: code而不是model.code,QML会在当前上下文查找code变量,而非model项的属性,从而抛出ReferenceError。

正确的委托写法:

delegate: Text {
    // 必须通过model.前缀访问项属性
    text: model.code + " | " + model.name
}

3. JSON数据本身存在语法错误

检查你的JSON是否符合标准格式:比如字符串用双引号、数组/对象末尾无多余逗号、键名必须双引号包裹。如果JSON语法错误,JSON.parse()会失败,model会是空值,自然无法显示数据。

4. 未使用ListModel包装(可选,适合动态数据场景)

如果后续要支持动态修改数据(比如从数据库加载后更新),建议用ListModel来包装数据,更符合QML的数据绑定机制:

ListView {
    id: listView
    width: 200
    height: 400

    model: ListModel { id: listModel }
    delegate: Text { text: model.code + " - " + model.name }

    Component.onCompleted: {
        let jsonStr = '[{"code":"001","name":"测试1"},{"code":"002","name":"测试2"}]';
        let dataArray = JSON.parse(jsonStr);
        // 逐个添加到ListModel
        dataArray.forEach(item => {
            listModel.append(item);
        });
    }
}

总结

先确认JSON语法正确,再通过JSON.parse()将其转为JS数组或ListModel,最后在委托中通过model.属性名的方式访问数据,就能解决ReferenceError和ListView不显示的问题。

内容的提问来源于stack exchange,提问作者Mendes

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 19:38:15