扑扑新手。我很难解码本地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'], ); } }
答案 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,
);