'_InternalLinkedHashMap<String, dynamic>'不是 'Iterable<dynamic>' 型的子类型



我有一个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;
  }
}

最新更新