【问题标题】:Getting type 'List<dynamic>' is not a subtype of type 'Map<String, dynamic>'error in JSON获取类型 'List<dynamic>' 不是 JSON 中类型 'Map<String, dynamic>' 错误的子类型
【发布时间】:2021-09-21 15:57:41
【问题描述】:

我确定你知道上面的问题。我想知道如何解决它。我知道我的数据是列表形式,但在我使用 map 的数据类中。我真的不明白我应该如何改变它来工作,基本上我只是跟着flutter.dev documentation

如果你想知道我做了什么

我基本上用 json_serializable 解析我的数据。在使用测试数据进行测试时一切正常。

我的数据:

我的模型包含一个标题、图像和一个名为 modelData 的嵌套类。

`import 'package:json_annotation/json_annotation.dart';

import 'modelData.dart';


part 'Modell.g.dart';

@JsonSerializable(explicitToJson: true)
class Modell {
  final String title;
  final String image;
  final ModelData modelData;

  Modell(this.title, this.image, this.modelData);

  factory Modell.fromJson(Map<String, dynamic> json)
  => _$ModellFromJson(json);
  Map<String, dynamic> toJson() => _$ModellToJson(this);}

`

    import 'package:json_annotation/json_annotation.dart';


part 'modelData.g.dart';

@JsonSerializable()
class ModelData {
  final String title;

  ModelData(this.title);

  factory ModelData.fromJson(Map<String, dynamic> json)
  => _$ModelDataFromJson(json);
  Map<String, dynamic> toJson() => _$ModelDataToJson(this);
}

我正在使用此代码使用数据:

      var modelle = const[];

  Future loadDataList() async {
    String content = await rootBundle.loadString("assets/ddddddd.json");
    List collection = json.decode(content);
    List<Modell> _modelle = collection.map((json) => Modell.fromJson(json)).toList();

    setState(() {
      modelle = _modelle;
    });
  }

  void initState() {
    loadDataList();
    super.initState();

& 如果需要,我的数据的一部分:

   [
   {
      "title":" Alfa Romeo ",
      "image":" AlfaRomeo.png ",
      "modelData":[
         {
            "title":" 4C ",
            "variantenData":[
               
            ]
         },

我希望我写得足够清楚和详细。如果我错过了什么,sry

-----更新-----

我测试了一下,发现只需添加 List 就不再出现错误,将进一步测试以查看解决方案是否真的按预期工作

    import 'package:json_annotation/json_annotation.dart';

import 'modelData.dart';


part 'Modell.g.dart';

@JsonSerializable(explicitToJson: true)
class Modell {
  final String title;
  final String image;
  List <ModelData> modelData; //adding List

  Modell(this.title, this.image, this.modelData);

  factory Modell.fromJson(Map<String, dynamic> json)
  => _$ModellFromJson(json);
  Map<String, dynamic> toJson() => _$ModellToJson(this);
}

【问题讨论】:

  • ModelData 是一个数组,而不是String,尽管据我所知
  • 我必须如何更改它才能正常工作?

标签: json flutter dart


【解决方案1】:

您已经解析了数据,除了名为 Modell 的类之外的所有数据都应该包含一个 ModelData 列表,而不是单个 ModelData。请将类型更改为 ModelData 列表,它应该可以正常工作。

class Modell {
  final String title;
  final String image;
  final List<ModelData> modelDataList;

  Modell(this.title, this.image, this.modelDataList);

  factory Modell.fromJson(Map<String, dynamic> json)
  => _$ModellFromJson(json);
  Map<String, dynamic> toJson() => _$ModellToJson(this);}```

【讨论】:

  • 谢谢,但它不起作用,如果您单击我发送的链接,您会看到我必须编写最终的 ModelData modelData;当我使用嵌套类时
  • "modelData":[ { "title":"4C", "variantenData":[ ]。 ModelData 显然是 Modell 类的列表吧。它是如何嵌套类的?
  • 我认为是,因为我有我的模型类,其中我有标题和图像,但在每个汽车品牌对象内部是另一个类,包含更具体的数据(模型数据),所以它嵌套,也许我犯了一个巨大的错误,但我认为它是这样的
  • 但是您提到的json数据清楚地显示了一个对象数组,其中包含标题、图像和一个名为modelData的键,这是一个包含标题和varientData的对象数组,这是另一个数组。跨度>
【解决方案2】:

在这部分:

  var modelle = const[];

  Future loadDataList() async {
    String content = await rootBundle.loadString("assets/ddddddd.json");
    List collection = json.decode(content);
    List<Modell> _modelle = collection.map((json) => Modell.fromJson(json)).toList();

    setState(() {
      modelle = _modelle;
    });
  }

  void initState() {
    loadDataList();
    super.initState();

这里更具体:

List collection = json.decode(content);

如果你去Flutter Example 会看到collection 会返回一个Map&lt;String, dynamic&gt;

尝试更改为:

Map<String, dynamic> collection = json.decode(content);

【讨论】:

  • 嘿,感谢您的建议,我今天早上尝试了一些方法并找到了修复错误的方法(不确定我是否完全修复它会进一步测试),我更新了问题,如果您有兴趣你可以看到什么对我有用
猜你喜欢
  • 2021-04-13
  • 2020-06-27
  • 2019-01-22
  • 2021-07-01
  • 2021-12-29
  • 2023-01-08
  • 2021-10-25
  • 2020-07-03
  • 2019-12-05
相关资源
最近更新 更多