首页 > 解决方案 > Flutter:将JSON文件的特定字段连接在一起,成为一个列表本身

问题描述

我有一个包含不同类型数据列表的 json 文件。

我想将每个城市的所有景点的“名称”字段一起作为一个列表。加入后的预期结果,例如 Longo city 将是这样的:

景点1

景点2

JSON 文件中的数据结构如下:

  {
    "city": "London",
    "attractions": [
      {
        "name": "Attraction1",
        "localrank": 10,
        "intrank": 4
      },
      {
        "name": "Attraction2",
        "localrank": 4,
        "intrank": 5
      }
    ]
  },
  {
    "city": "Hong Kong",
    "attractions": [
      {
        "name": "Attraction3",
        "localrank": 10,
        "intrank": 4
      },
      {
        "name": "Attraction4",
        "localrank": 4,
        "intrank": 5
      }
    ]
  },
  {
    "city": "Cario",
    "attractions": [
      {
        "name": "Attraction5",
        "localrank": 10,
        "intrank": 4
      },
      {
        "name": "Attraction6",
        "localrank": 4,
        "intrank": 5
      }
    ]
  }
] 

我使用了以下代码,但出现错误:

cities.attractions.name.join("\n")

Json模型类是这样的:

List<Cities> citiesFromJson(String str) =>
    List<Cities>.from(json.decode(str).map((x) => Cities.fromJson(x)));
String citiesToJson(List<Cities> data) =>
    json.encode(List<dynamic>.from(data.map((x) => x.toJson())));

class Cities {
  Cities({
    this.city,
    this.attractions,
  });

  String city;
  List<Attraction> attractions;

  factory Cities.fromRawJson(String str) => Cities.fromJson(json.decode(str));

  String toRawJson() => json.encode(toJson());

  factory Cities.fromJson(Map<String, dynamic> json) => Cities(
        city: json["city"],
        attractions: List<Attraction>.from(
            json["attractions"].map((x) => Attraction.fromJson(x))),
      );

  Map<String, dynamic> toJson() => {
        "city": city,
        "attractions": List<dynamic>.from(attractions.map((x) => x.toJson())),
      };
}

class Attraction {
  Attraction({
    this.name,
    this.localrank,
    this.intrank,
  });

  String name;
  int localrank;
  int intrank;

  factory Attraction.fromRawJson(String str) =>
      Attraction.fromJson(json.decode(str));

  String toRawJson() => json.encode(toJson());

  factory Attraction.fromJson(Map<String, dynamic> json) => Attraction(
        name: json["name"],
        localrank: json["localrank"],
        intrank: json["intrank"],
      );

  Map<String, dynamic> toJson() => {
        "name": name,
        "localrank": localrank,
        "intrank": intrank,
      };
}

这也调用 json 文件:

  Future<String> fetchData() async {
    String data =
        await DefaultAssetBundle.of(context).loadString("assets/data.json");
    final jsonResult = json.decode(data);
    print('$jsonResult oop');
    this.setState(() {
      jsonResult.forEach(
          (element) => Globals.citylist.add(new Cities.fromJson(element)));
    });
    return "Success!";
  }

标签: jsonlistflutterdart

解决方案


像这样的东西应该工作:

import 'dart:convert';

var data = """  [{
    "city": "London",
    "attractions": [
      {
        "name": "Attraction1",
        "localrank": 10,
        "intrank": 4
      },
      {
        "name": "Attraction2",
        "localrank": 4,
        "intrank": 5
      }
    ]
  },
  {
    "city": "Hong Kong",
    "attractions": [
      {
        "name": "Attraction3",
        "localrank": 10,
        "intrank": 4
      },
      {
        "name": "Attraction4",
        "localrank": 4,
        "intrank": 5
      }
    ]
  },
  {
    "city": "Cario",
    "attractions": [
      {
        "name": "Attraction5",
        "localrank": 10,
        "intrank": 4
      },
      {
        "name": "Attraction6",
        "localrank": 4,
        "intrank": 5
      }
    ]
  }
] """;

List<Cities> citiesFromJson(String str) =>
    List<Cities>.from(json.decode(str).map((x) => Cities.fromJson(x)));
String citiesToJson(List<Cities> data) =>
    json.encode(List<dynamic>.from(data.map((x) => x.toJson())));

class Cities {
  Cities({
    this.city,
    this.attractions,
  });

  String city;
  List<Attraction> attractions;

  factory Cities.fromRawJson(String str) => Cities.fromJson(json.decode(str));

  String toRawJson() => json.encode(toJson());

  factory Cities.fromJson(Map<String, dynamic> json) => Cities(
    city: json["city"],
    attractions: List<Attraction>.from(
        json["attractions"].map((x) => Attraction.fromJson(x))),
  );

  Map<String, dynamic> toJson() => {
    "city": city,
    "attractions": List<dynamic>.from(attractions.map((x) => x.toJson())),
  };
}

class Attraction {
  Attraction({
    this.name,
    this.localrank,
    this.intrank,
  });

  String name;
  int localrank;
  int intrank;

  factory Attraction.fromRawJson(String str) =>
      Attraction.fromJson(json.decode(str));

  String toRawJson() => json.encode(toJson());

  factory Attraction.fromJson(Map<String, dynamic> json) => Attraction(
    name: json["name"],
    localrank: json["localrank"],
    intrank: json["intrank"],
  );

  Map<String, dynamic> toJson() => {
    "name": name,
    "localrank": localrank,
    "intrank": intrank,
  };
}

class Globals {
  static List<Cities> citylist = [];
}

Future<String> fetchData() async {
  // String data =
  // await DefaultAssetBundle.of(context).loadString("assets/data.json");
  final jsonResult = json.decode(data);
  print('$jsonResult oop');
  // this.setState(() {
    jsonResult.forEach(
            (element) => Globals.citylist.add(new Cities.fromJson(element)));
  // });

  var result = getAttractionsByCity('London');

  print(result.join('\n'));

  return "Success!";
}

List<String> getAttractionsByCity(String value) {
  var result = <String>[];

  for (final city in Globals.citylist) {
    if (city.city == value) {
      final attractions = city.attractions;

      for (final attraction in attractions) {
        result.add(attraction.name);
      }
    }
  }

  return result;
}

void main() async {
  await fetchData();
}

这是一个有效的例子。您可以将此代码复制并粘贴到 HTTP://dartpad.dev 并运行它以查看结果。


推荐阅读