Разбор вложенного JSON в Dart / Flutter

#json #class #flutter #dictionary #dart

#json #класс #flutter #словарь #dart

Вопрос:

Я пытаюсь разобрать свой JSON в объект класса данных. Я провел некоторое исследование и наткнулся на несколько полезных статей, но все еще сталкиваюсь с ошибками.

Ответ, который я получаю от серверной части:

   "entrances": {
    "options": {
      "mainEntrance": {
        "text": "Enter through the main doors"
      },
      "backEntrance": {
        "text": "Enter through the back doors"
      },
      "sideEntrance": {
        "text": "Enter through the side doors"
      }
    },
    "footer": "Text goes here"
  },
  "status": {
    "state": "open"
  }
}
  

Модель

 class MyClass {
  String id;
  Options option;

  MyClass({this.id, this.option});

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

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

class Options {
  String name;
  String text;

  Options({this.name, this.text});

  Options.fromJson(Map<String, dynamic> json) {
    name = json['name'];
    text = json['text'];
  }

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

Декодирование ответа и отображение

       setState(() {

        Map myMap = json.decode(response.body);
        List<MyClass> myClassList = new List<MyClass>();
        myMap['entrances'].forEach((key, value) {
          value['id'] = key;
          myClassList.add(MyClass.fromJson(value));
        });

        myClassList.forEach((MyClass) {
          print(MyClass.id);
          print(MyClass.option.name);
          print("--------------------n");
        });
      });
  

Я получаю эту ошибку:

 Unhandled Exception: NoSuchMethodError: Class 'String' has no instance method '[]='.
Tried calling: []=("id", "footer")
  

Что я делаю не так? Существуют ли лучшие подходы?

Ответ №1:

Вы можете использовать этот веб-сайт для преобразования вашего JSON в модель Dart. Я предполагаю, что ваш JSON начинается с фигурных скобок.

 
{
    "entrances": {
        "options": {
            "mainEntrance": {
                "text": "Enter through the main doors"
            },
            "backEntrance": {
                "text": "Enter through the back doors"
            },
            "sideEntrance": {
                "text": "Enter through the side doors"
            }
        },
        "footer": "Text goes here"
    },
    "status": {
        "state": "open"
    }
}

  

Тогда ваша модель должна выглядеть так:

 
class ResponseModel {
  Entrances entrances;
  Status status;

  ResponseModel({this.entrances, this.status});

  ResponseModel.fromJson(Map<String, dynamic> json) {
    entrances = json['entrances'] != null
        ? new Entrances.fromJson(json['entrances'])
        : null;
    status =
        json['status'] != null ? new Status.fromJson(json['status']) : null;
  }

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

class Entrances {
  Options options;
  String footer;

  Entrances({this.options, this.footer});

  Entrances.fromJson(Map<String, dynamic> json) {
    options =
        json['options'] != null ? new Options.fromJson(json['options']) : null;
    footer = json['footer'];
  }

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

class Options {
  MainEntrance mainEntrance;
  MainEntrance backEntrance;
  MainEntrance sideEntrance;

  Options({this.mainEntrance, this.backEntrance, this.sideEntrance});

  Options.fromJson(Map<String, dynamic> json) {
    mainEntrance = json['mainEntrance'] != null
        ? new MainEntrance.fromJson(json['mainEntrance'])
        : null;
    backEntrance = json['backEntrance'] != null
        ? new MainEntrance.fromJson(json['backEntrance'])
        : null;
    sideEntrance = json['sideEntrance'] != null
        ? new MainEntrance.fromJson(json['sideEntrance'])
        : null;
  }

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

class MainEntrance {
  String text;

  MainEntrance({this.text});

  MainEntrance.fromJson(Map<String, dynamic> json) {
    text = json['text'];
  }

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

class Status {
  String state;

  Status({this.state});

  Status.fromJson(Map<String, dynamic> json) {
    state = json['state'];
  }

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


  

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

1. Спасибо. Можете ли вы привести пример того, как отображать данные с помощью listview.builder?