【问题标题】:Advanced json parse in dartdart 中的高级 json 解析
【发布时间】:2021-11-16 13:00:18
【问题描述】:

我想解析这个 Json。现在我将Load 解析为具有2 个字段的类:idvalue。但我想要的是像Map<int, String> 一样解析它。当我尝试投射对象时,颤动给了我一个错误。例如:

Map<int, String> map = {
  38 : "#1038 Fort Dodge, IA - Algona, IA",
  39 : "#1039 Louisville, KY - Louisville, KY"
}

this question不一样

{
    "loads": {
      "data": [
        {
          "id": 38,
          "value": "#1038 Fort Dodge, IA - Algona, IA"
        },
        {
          "id": 39,
          "value": "#1039 Louisville, KY - Louisville, KY"
        }
      ]
    },
    "date_ranges": {
      "data": [
        {
          "id": "all_time",
          "value": "All"
        },
        {
          "id": "this_year",
          "value": "This year"
        }
      ]
    }
  }

【问题讨论】:

  • 你能分享一些代码吗?
  • 这能回答你的问题吗? Parse JSON to Map in flutter
  • No(( 其实这是个笼统的问题,不高级((
  • @AkbarPulatov 请看看我的回答,对你有帮助

标签: json flutter dart parsing


【解决方案1】:

您发现了一个问题,因为 loadsdate_ranges 包含相同的子名称 data 但属性不同,这就是您的模型类返回错误的原因

这里我写了一个加载代码,请大家看看

void main() {

 Map<int, String> map = {
};
  
  var mapdata = {
    "loads": {
      "data": [
        {
          "id": 50,
          "value": "#1038 Fort Dodge, IA - Algona, IA"
        },
        {
          "id": 39,
          "value": "#1039 Louisville, KY - Louisville, KY"
        }
      ]
    },
    "date_ranges": {
      "data": [
        {
          "id": "all_time",
          "value": "All"
        },
        {
          "id": "this_year",
          "value": "This year"
        }
      ]
    }
  };
  TestModel test = TestModel.fromJson(mapdata);
  test.loads.data.forEach((e)=>map[e.id]=e.value);
  
  print(map);
}

class TestModel {
  Loads loads;
  Loads dateRanges;

  TestModel({this.loads, this.dateRanges});

  TestModel.fromJson(Map<String, dynamic> json) {
    loads = json['loads'] != null ? new Loads.fromJson(json['loads']) : null;
    dateRanges = json['date_ranges'] != null
        ? new Loads.fromJson(json['date_ranges'])
        : null;
  }

  Map<String, dynamic> toJson() {
    final Map<String, dynamic> data = new Map<String, dynamic>();
    if (this.loads != null) {
      data['loads'] = this.loads.toJson();
    }
    if (this.dateRanges != null) {
      data['date_ranges'] = this.dateRanges.toJson();
    }
    return data;
  }
}

class Loads {
  List<Data> data;

  Loads({this.data});

  Loads.fromJson(Map<String, dynamic> json) {
    if (json['data'] != null) {
      data = new List<Data>();
      json['data'].forEach((v) {
        data.add(new Data.fromJson(v));
      });
    }
  }

  Map<String, dynamic> toJson() {
    final Map<String, dynamic> data = new Map<String, dynamic>();
    if (this.data != null) {
      data['data'] = this.data.map((v) => v.toJson()).toList();
    }
    return data;
  }
}

class Data {
  var id; // here changes the type
  String value;

  Data({this.id, this.value});

  Data.fromJson(Map<String, dynamic> json) {
    id = json['id'];
    value = json['value'];
  }

  Map<String, String> toJson() {
    final Map<String, String> data = new Map<String, String>();
    data['id'] = this.id;
    data['value'] = this.value;
    return data;
  }
}

地图结果:

{50: #1038 Fort Dodge, IA - Algona, IA, 39: #1039 Louisville, KY - Louisville, KY}

注意:使用 var 类型使您的 id 动态化

【讨论】:

  • 您没有听懂问题。带有字段idvalue 的类是我现在正在使用的方法,但所要求的不是新类,而是使用Map&lt;int, String&gt; 类型。例如Map&lt;int, String&gt; map = {38: "#1038 Fort Dodge, IA - Algona, IA"}.
  • 您想将您的数据转换为具有 id 和 value 属性的映射数据吗?
  • 投射不工作。它可能看起来像Map&lt;int, String&gt; map = {}; map[json["id"]] = json["value"];
  • 更新了我的答案请检查
  • 不应该有像idvalue这样的字段。它们只是 Map 的键和值。
【解决方案2】:

你可以创建 pojo 类来解析你的 JSON

TestModel testModel = TestModel.fromJson(yourResponse);


 class TestModel {
  Loads loads;
  Loads dateRanges;

  TestModel({this.loads, this.dateRanges});

  TestModel.fromJson(Map<String, dynamic> json) {
    loads = json['loads'] != null ? new Loads.fromJson(json['loads']) : null;
    dateRanges = json['date_ranges'] != null
        ? new Loads.fromJson(json['date_ranges'])
        : null;
  }

  Map<String, dynamic> toJson() {
    final Map<String, dynamic> data = new Map<String, dynamic>();
    if (this.loads != null) {
      data['loads'] = this.loads.toJson();
    }
    if (this.dateRanges != null) {
      data['date_ranges'] = this.dateRanges.toJson();
    }
    return data;
  }
}

class Loads {
  List<Data> data;

  Loads({this.data});

  Loads.fromJson(Map<String, dynamic> json) {
    if (json['data'] != null) {
      data = new List<Data>();
      json['data'].forEach((v) {
        data.add(new Data.fromJson(v));
      });
    }
  }

  Map<String, dynamic> toJson() {
    final Map<String, dynamic> data = new Map<String, dynamic>();
    if (this.data != null) {
      data['data'] = this.data.map((v) => v.toJson()).toList();
    }
    return data;
  }
}

class Data {
  int id;
  String value;

  Data({this.id, this.value});

  Data.fromJson(Map<String, dynamic> json) {
    id = json['id'];
    value = json['value'];
  }

  Map<String, dynamic> toJson() {
    final Map<String, dynamic> data = new Map<String, dynamic>();
    data['id'] = this.id;
    data['value'] = this.value;
    return data;
  }
}

class Data {
  String id;
  String value;

  Data({this.id, this.value});

  Data.fromJson(Map<String, dynamic> json) {
    id = json['id'];
    value = json['value'];
  }

  Map<String, dynamic> toJson() {
    final Map<String, dynamic> data = new Map<String, dynamic>();
    data['id'] = this.id;
    data['value'] = this.value;
    return data;
  }
}

【讨论】:

  • 对于您的友好信息,您将得到错误,因为在您的 pojo 类中您定义了两个具有相同名称的类
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-11-25
  • 2018-05-21
  • 2020-02-14
  • 1970-01-01
  • 2021-07-10
  • 2022-01-09
  • 1970-01-01
相关资源
最近更新 更多