Трудности при загрузке и сохранении JSON файлов - PullRequest
0 голосов
/ 11 марта 2020

Я хочу спросить, что означает следующая ошибка и как ее исправить:

import 'dart:convert';
import './topic.dart';

class Subject {
  String name;
  bool isMajor;
  List<Topic> topics;

  Subject({this.name, this.isMajor, this.topics});

  factory Subject.fromJSON(Map<String, dynamic> json) {
    if (json != null) {
      return Subject(
          name: json['name'],
          isMajor: json['isMajor'],
          topics: List<Topic>.from(
              json['topics'].map((topic) => Topic.fromJSON(topic))));
    } else {
      return null;
    }
  }

  Map<String, dynamic> toJSON() {
    return {
      'name': name,
      'isMajor': isMajor,
      'topics': topics.map((topic) => jsonEncode(topic.toJSON())).toList(),
    };
  }
}

Ошибка относится к этой строке: json['topics'].map((topic) => Topic.fromJSON(topic))));

Она гласит: _TypeError (type 'String' is not a subtype of type 'Map<String, dynamic>').

У меня есть идея, что между [{ data: ... }] и { data: ... } есть какая-то разница, но я не знаю, где это исправить!

Возможно, у вас есть окончательный ключ !

Образец JSON:

[
  {
    "name": "Amet do id ea velit",
    "isMajor": true,
    "topics": [
      {
        "name": "Elit exercitation excepteur",
        "contents": [
          {
            "title": "Ad id irure aute exercitation occaecat nostrud",
            "body": "Cupidatat nisi ad quis officia aliqua fugiat ullamco",
            "isImportant": false
          }
        ]
      }
    ]
  }
]

Ответы [ 3 ]

0 голосов
/ 11 марта 2020

Проблема в том, что я не должен использовать jsonEncode .

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

  Map<String, dynamic> toJSON() {
    return {
      'name': name,
      'isMajor': isMajor,
      'topics': topics,
    };
  }
0 голосов
/ 12 марта 2020

Используйте этот класс модели:

class Subject  {
  String name;
  bool isMajor;
  List<Topics> topics;

  Subject({this.name, this.isMajor, this.topics});

  Subject.fromJson(Map<String, dynamic> json) {
    name = json['name'];
    isMajor = json['isMajor'];
    if (json['topics'] != null) {
      topics = new List<Topics>();
      json['topics'].forEach((v) {
        topics.add(new Topics.fromJson(v));
      });
    }
  }

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

class Topics {
  String name;
  List<Contents> contents;

  Topics({this.name, this.contents});

  Topics.fromJson(Map<String, dynamic> json) {
    name = json['name'];
    if (json['contents'] != null) {
      contents = new List<Contents>();
      json['contents'].forEach((v) {
        contents.add(new Contents.fromJson(v));
      });
    }
  }

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

class Contents {
  String title;
  String body;
  bool isImportant;

  Contents({this.title, this.body, this.isImportant});

  Contents.fromJson(Map<String, dynamic> json) {
    title = json['title'];
    body = json['body'];
    isImportant = json['isImportant'];
  }

  Map<String, dynamic> toJson() {
    final Map<String, dynamic> data = new Map<String, dynamic>();
    data['title'] = this.title;
    data['body'] = this.body;
    data['isImportant'] = this.isImportant;
    return data;
  }
}
0 голосов
/ 11 марта 2020

{ data: ... } Здесь вы получаете единственный объект

[{ data: ... }] Здесь вы получаете список этого объекта.

Если вы опубликовали свои классы моделей, просто отредактируйте добавьте следующее:

1) поместите ваш образец JSON.

2) и просто покажите код, в котором вы получаете ошибку, иначе блок кода будет оценен.

Итак, что я сделал, это создал пример от вас json, который вы предоставили:

Ниже приведен пример json, который вы предоставили:

[
    {
      "name": "Amet do id ea velit",
      "isMajor": true,
      "topics": [
        {
          "name": "Elit exercitation excepteur",
          "contents": [
            {
              "title": "Ad id irure aute exercitation occaecat nostrud",
              "body": "Cupidatat nisi ad quis officia aliqua fugiat ullamco",
              "isImportant": false
            }
          ]
        }
      ]
    }
  ]

проверьте класс модели ниже для json, который вы предоставили

// To parse this JSON data, do
//
//     final subject = subjectFromJson(jsonString);

import 'dart:convert';

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

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

class Subject {
    String name;
    bool isMajor;
    List<Topic> topics;

    Subject({
        this.name,
        this.isMajor,
        this.topics,
    });

    factory Subject.fromJson(Map<String, dynamic> json) => Subject(
        name: json["name"],
        isMajor: json["isMajor"],
        topics: List<Topic>.from(json["topics"].map((x) => Topic.fromJson(x))),
    );

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

class Topic {
    String name;
    List<Content> contents;

    Topic({
        this.name,
        this.contents,
    });

    factory Topic.fromJson(Map<String, dynamic> json) => Topic(
        name: json["name"],
        contents: List<Content>.from(json["contents"].map((x) => Content.fromJson(x))),
    );

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

class Content {
    String title;
    String body;
    bool isImportant;

    Content({
        this.title,
        this.body,
        this.isImportant,
    });

    factory Content.fromJson(Map<String, dynamic> json) => Content(
        title: json["title"],
        body: json["body"],
        isImportant: json["isImportant"],
    );

    Map<String, dynamic> toJson() => {
        "title": title,
        "body": body,
        "isImportant": isImportant,
    };
}

, просто проверьте код ниже:

import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:sample_project_for_api/model.dart';

void main() => runApp(MyApp());

class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {

  List<Subject> subjectList = List();
  List<Topic> topicList = List();
  List<Content> contentList = List();

  @override
  void initState() {
    super.initState();
    loadYourData();
  }

  loadYourData() async {
    String responseStr = await loadFromAssets();
    List<Subject> subject = subjectFromJson(responseStr);
    // here from above you complete subjects list
    for (int i = 0; i < subject.length; i++) {
      print(subject[i].isMajor.toString());
      print(subject[i].name);
      print(subject[i].topics.length);
      topicList = subject[i].topics;
      // here you get the topics list from above
      for (int j = 0; j < topicList.length; j++) {
        print(topicList[j].name);

        contentList = topicList[j].contents;
        // here you get the contents list

        for (int z = 0; z < contentList.length; z++) {
          print(contentList[z].body);

          print(contentList[z].isImportant.toString());

          print(contentList[z].title);
        }
      }
    }
  }

  Future<String> loadFromAssets() async {
    return await rootBundle.loadString('json/parse.json');
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      debugShowCheckedModeBanner: false,
      home: Scaffold(
        body: Center(
            child: Text('Random Text sample')),
      ),
    );
  }
}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...