我有一个json对象,我想抓住并添加到模型TestModel
。
json:
{
"fontSize" : "39",
"fontFamily" : "A",
"fontWeigth" : "bold",
"fontColor" : "blue"
}
使用以下模型:
class TestModel {
late String fontSize;
TestModel(this.fontSize);
TestModel.fromJson(Map<String, dynamic> json) {
fontSize = (json['fontSize']);
}
}
类DataFetcher()
有一个方法fetchData()
,我想获取json数据,然后将其添加到模型TestModel()
。
class DataFetcher{
Future<List<TestModel>> fetchData() async {
var settingsList = List<TestModel>.empty();
String jsonData = await rootBundle.loadString('assets/test_settings.json');
var data = jsonDecode(jsonData);
debugPrint(jsonEncode(data).toString());
for (var value in data) {
settingsList.add(TestModel.fromJson(value));
}
return settingsList;
}
}
但是当我想测试这个方法是否有效时,我得到以下错误:
I/flutter (12015): {fontSize: 39, fontFamily: A, fontWeigth: bold, fontColor: blue}
E/flutter (12015): [ERROR:flutter/shell/common/shell.cc(93)] Dart Unhandled Exception:
type '_InternalLinkedHashMap<String, dynamic>' is not a subtype of type 'Iterable<dynamic>', stack trace: #0
FetchSettings.getSettingsJson (package:test_project/controllers/getters/get_test.dart:15:23)
E/flutter (12015): <asynchronous suspension>
E/flutter (12015):
data
的类型是_InternalLinkedHashMap<String, dynamic>
, for循环期望的类型是Iterable<dynmic>
正如你所看到的,当我调试data
时,我用Map<String, dynamic>
类型获得了对象。如何解决这个错误?
编辑
我已经更改了json文件的内容
如果只有一个条目,你应该这样做。
class DataFetcher {
Future<List<TestModel>> fetchData() async {
List<TestModel> settingsList = [];
String jsonData = await rootBundle.loadString('assets/test_settings.json');
//its just one item in the json file, so just show that item instead of trying to iterate through it
var aa = TestModel.fromJson(jsonDecode(jsonData));
print(aa.fontSize);
return settingsList;
}
}
但是如果你的json是多个…像这样. .
[
{
"fontSize" : "39",
"Somethingelse": "asdasasd"
}
,
{
"fontSize" : "10",
"Somethingelse": "Heasdasdasdllo"
}
,
{
"fontSize" : "25",
"Somethingelse": "aaaaaaaaaaaaaaaaaaaa"
}
]
那么你必须这样做…
class DataFetcher {
Future<List<TestModel>> fetchData() async {
List<TestModel> settingsList = [];
String jsonData = await rootBundle.loadString('assets/test_settings.json');
var aa = jsonDecode(jsonData) as List;
for (var value in aa) {
settingsList.add(TestModel.fromJson(value));
}
return settingsList;
}
}