Сохраните десериализованный json в списке объектов, которые трепещут

#json #flutter #dart

Вопрос:

Я успешно десериализовал свой файл json. Я успешно сохранил один элемент json в одном объекте , но у меня возникли проблемы с хранением объектов в списке.

Я перепробовал все возможные решения из Интернета, ниже вы увидите, какие испытания я провел.

Это мой код

 class _MyHomePageState extends State<MyHomePage> {
  String? _chosenSubCounty;
  List<County> counties = [];

  Future<String> getJson() async {
    final jsonResult = await rootBundle.loadString('assets/json_files/counties.json');

    List<dynamic> parsedListJson = jsonDecode(jsonResult);
    print(parsedListJson[0]);//prints {name: Baringo, capital: Kabarnet, code: 30, sub_counties: [Baringo central, Baringo north, Baringo south, Eldama ravine, Mogotio, Tiaty]}

    final county = County.fromJson(parsedListJson[0]);
    print(county.name.toString());//prints Baringo

    //trial no 1 failed
    counties = parsedListJson.map((i)=>County.fromJson(i)).toList();
    //trial no 2 also failed    
    counties = List<County>.from(parsedListJson.map((i) => County.fromJson(i)));
    //trial no 3 also failed
    for(int i = 0; i < parsedListJson.length; i  ){
      counties.add(County.fromJson(parsedListJson[i]));
    }

    print(counties);//prints Error: Expected a value of type 'String', but got one of type 'Null'

    return jsonResu<
  }

  @override
  void initState() {
    getJson();
  }
  @override
  Widget build(BuildContext context) {..........}

}
 

Это класс модели

 import 'dart:convert';

List<County> countyFromJson(String str) => List<County>.from(json.decode(str).map((x) => County.fromJson(x)));
String countyToJson(List<County> data) => json.encode(List<dynamic>.from(data.map((x) => x.toJson())));

class County {
  String name;
  String capital;
  int code;
  List subCounties;

  County({
    required this.name,
    required this.capital,
    required this.code,
    required this.subCounties,
  });

  factory County.fromJson(Map<String, dynamic> json) {
    
    return County(
      name: json["name"],
      capital: json["capital"],
      code: json["code"],
      subCounties: List<String>.from(json["sub_counties"])
    );
  }
  Map<String, dynamic> toJson() => {
    "name": name,
    "capital": capital == null ? null : capital,
    "code": code,
    "sub_counties": List<dynamic>.from(subCounties.map((x) => x)),
  };
  
}
 

Это файл json

 [
    {
        "name": "Baringo",
        "capital": "Kabarnet",
        "code": 30,
        "sub_counties": [
            "Baringo central",
            "Baringo north",
            "Baringo south",
            "Eldama ravine",
            "Mogotio",
            "Tiaty"
        ]
    },
    {
        "name": "Bomet",
        "capital": "Bomet",
        "code": 36,
        "sub_counties": [
            "Bomet central",
            "Bomet east",
            "Chepalungu",
            "Konoin",
            "Sotik"
        ]
    },
]
 

Ответ №1:

Сначала удалите запятую после 2-го объекта json из файла json. Затем используйте этот код для анализа вашего json. Я запустил проект, и он работает совершенно нормально.

 import 'package:flutter/material.dart';
import 'package:stacksolution/county_model.dart';

class FetchData extends StatefulWidget {
  const FetchData({Key? key}) : super(key: key);

  @override
  _FetchDataState createState() => _FetchDataState();
}

class _FetchDataState extends State<FetchData> {
  @override
  void initState() {
    // TODO: implement initState
    callJson();
    super.initState();
  }

  callJson() async {
    String jsonString =
        await DefaultAssetBundle.of(context).loadString('assets/county.json');
    List<CountyModel> list = countyFromJson(jsonString);
    print("$list");
  }

  @override
  Widget build(BuildContext context) {
    return Container();
  }
}
 

Класс модели:

 import 'dart:convert';

List<CountyModel> countyFromJson(String str) => List<CountyModel>.from(
    json.decode(str).map((x) => CountyModel.fromJson(x)));

String countyToJson(List<CountyModel> data) =>
    json.encode(List<dynamic>.from(data.map((x) => x.toJson())));

class CountyModel {
  CountyModel({
    this.name,
    this.capital,
    this.code,
    this.subCounties,
  });

  String? name;
  String? capital;
  int? code;
  List<String>? subCounties;

  factory CountyModel.fromJson(Map<String, dynamic> json) => CountyModel(
        name: json["name"],
        capital: json["capital"],
        code: json["code"],
        subCounties: List<String>.from(json["sub_counties"].map((x) => x)),
      );

  Map<String, dynamic> toJson() => {
        "name": name,
        "capital": capital,
        "code": code,
        "sub_counties": List<dynamic>.from(subCounties!.map((x) => x)),
      };
}
 

Файл Json:

 [
    {
        "name": "Baringo",
        "capital": "Kabarnet",
        "code": 30,
        "sub_counties": [
            "Baringo central",
            "Baringo north",
            "Baringo south",
            "Eldama ravine",
            "Mogotio",
            "Tiaty"
        ]
    },
    {
        "name": "Bomet",
        "capital": "Bomet",
        "code": 36,
        "sub_counties": [
            "Bomet central",
            "Bomet east",
            "Chepalungu",
            "Konoin",
            "Sotik"
        ]
    }
]
 

Комментарии:

1. Я обновлю ответ полным кодом

2. Это сработало, спасибо