【问题标题】:How to decode local json list to model objects?如何将本地 json 列表解码为模型对象?
【发布时间】:2020-03-06 01:01:03
【问题描述】:

Flutter 新手在这里。我很难尝试将本地 json 列表解码为模型对象。

到目前为止,我成功地展示了我想展示的内容,例如:
我的数据[索引]['id']
myData[index]['name']

但我想使用我已经创建的模型对象,例如:
规则.id
规则名称

并最终通过 onTap 事件传递规则对象。

这是我用来加载json的代码:future:DefaultAssetBundle.of(context).loadString('assets/rule.json'),

这是 FutureBuilder 中的代码。

        var myData = json.decode(snapshot.data);

        return ListView.builder(
          itemBuilder: (BuildContext context, int index) {
            return Padding(
              padding: const EdgeInsets.all(10.0),
              child: ListTile(
                leading: Icon(Icons.people),
                title: Text(myData[index]['id']),
                subtitle: Text(myData[index]['name']),
                trailing: Icon(Icons.keyboard_arrow_right),
                onTap: () => RuleDetailPage.show(context),
              ),
            );
          },
          itemCount: myData == null ? 0 : myData.length,
        );
      },
    )
);

fromJson 方法如下所示:

工厂 Rule.fromJson(Map json) { 返回规则( id: json['id'], 名称:json['name'], ); } }

【问题讨论】:

  • 您好,您的要求还不是很清楚。事实上,这似乎是一个非常广泛的问题,因为可能有不止一种方法可以做你提到的那种事情。网上有大量的技术信息可以开始这种事情。建议您尝试研究该主题,尝试您想使用的方法,如果您遇到互联网搜索无法回答的特定问题,请在此处发布。

标签: flutter


【解决方案1】:

您似乎需要一个 JSON 对象列表。只需将decode 的结果转换为一个列表,然后通过将每个 JSON 对象传递给您的工厂,将其映射为一个规则。

像这样:

var myData = json.decode(snapshot.data) as List;

List<Rule> rules = list.map((item) {
  return Rule.fromJson(item);
}).toList();

return ListView.builder(
  itemBuilder: (BuildContext context, int index) {i
    Rule currentRule = rules[index];
    return Padding(
      padding: const EdgeInsets.all(10.0),
      child: ListTile(
        leading: Icon(Icons.people),
        title: Text(currentRule.id),
        subtitle: Text(currentRule.name),
        trailing: Icon(Icons.keyboard_arrow_right),
        onTap: () => RuleDetailPage.show(context),
      ),
    );
  },
  itemCount: myData == null ? 0 : rules.length,
);

【讨论】:

  • 这符合我想要的方式,只需进行一些小改动。谢谢!
【解决方案2】:

我认为您正在寻找 json 解析器:https://app.quicktype.io/ 这将允许您创建一个模型类,然后您将能够以您建议的方式调用您的对象。

【讨论】:

  • 这是一个很好的资源。感谢发布!
  • 感谢您的分享。我能够创建类,但我不知道如何解析数组,解析器实际上为它提供了代码!
【解决方案3】:

如果我理解你的问题,你已经完成了大部分工作;-)

json.decode(snapshot.data) 返回一个 Json 对象,该对象可以是 Map&lt;String, dynamic&gt;List&lt;dynamic&gt;,用于判断 json 的根节点是对象还是数组。

您似乎已经实现了fromJson 工厂方法,除非您想尝试@code-poet 提到的解析库

所以只需组装代码的所有部分:var rules = Rule.fromJson(json.decode(snapshot.data)); et voilà!

如果您的snapshot.data 包含Rule 的数组,那么如上所述json.decode 返回一个列表,您必须编写:json.map((j) =&gt; Rule.fromJson(j)).toList();

【讨论】:

  • 是的,它是一个数组。我完全错过了 .toList()。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-11-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-15
相关资源
最近更新 更多