如何解码本地json列表以建模对象?

时间:2019-11-09 19:23:56

标签: flutter

扑扑新手。我很难解码本地json列表以建模对象。

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

但是我想使用已经创建的模型对象,例如:
rule.id
rule.name

并最终通过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(地图json){     返回规则(       id:json ['id'],       名称:json ['name'],      );   } }

3 个答案:

答案 0 :(得分:0)

我认为您正在寻找json解析器:https://app.quicktype.io/ 这样,您就可以创建模型类,然后按照建议的方式调用对象。

答案 1 :(得分:0)

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

json.decode(snapshot.data)返回一个Json对象,该对象可以是Map<String, dynamic>List<dynamic>,关于json的根节点是对象还是数组。

似乎您已经实现了fromJson工厂方法,除非您要尝试使用@ code-poet提到的解析库,否则就可以使用

因此,只需汇编代码的所有部分:var rules = Rule.fromJson(json.decode(snapshot.data));等!

如果您的snapshot.data包含Rule数组,则如上所述json.decode返回一个列表,您必须输入:json.map((j) => Rule.fromJson(j)).toList();

答案 2 :(得分:0)

您似乎正在期待JSON对象的列表。只需将decode的结果转换为列表,然后将每个JSON对象传递到工厂中,即可将其映射到Rule中。

像这样:

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,
);