如何在Flutter中将对象编码为json

时间:2019-06-01 12:08:11

标签: json flutter dart

我正在尝试将对象“ Week”转换为json。

https://flutter.dev/docs/development/data-and-backend/json这是我使用的来源

class Week{
  DateTime _startDate;
  DateTime _endDate;
  List<Goal> _goalList;
  String _improvement;

  Week(this._startDate, this._endDate){
    this._goalList = List<Goal>();
    this._improvement = "";
  }

  Week.fromJson(Map<String, dynamic> json)
    : _startDate =  json['startDate'],
      _endDate = json['endDate'],
      _goalList = json['goalList'],
      _improvement = json['improvement'];

  Map<String, dynamic> toJson() => 
  {
    'startDate': _startDate,
    'endDate': _endDate,
    'goalList': _goalList,
    'improvement': _improvement,
  };
}

我用了这个:

DateTime startDate = currentDate.subtract(new Duration(days:(weekday-1)));
DateTime endDate = currentDate.add(new Duration(days:(7-weekday)));

Week week = new Week(startDate, endDate);
var json = jsonEncode(week);

但是问题是我得到了这个结果:

Unhandled Exception: Converting object to an encodable object failed: Instance of 'Week'
#0      _JsonStringifier.writeObject (dart:convert/json.dart:647:7)
#1      _JsonStringStringifier.printOn (dart:convert/json.dart:834:17)
#2      _JsonStringStringifier.stringify (dart:convert/json.dart:819:5)
#3      JsonEncoder.convert (dart:convert/json.dart:255:30)
#4      JsonCodec.encode (dart:convert/json.dart:166:45)
#5      jsonEncode (dart:convert/json.dart:80:10)

3 个答案:

答案 0 :(得分:0)

jsonEncode需要一个Map<String, dynamic>,而不是Weak对象。调用您的toJson()方法即可解决问题。

var json = jsonEncode(week.toJson());

但是,请记住,您的toJson()方法也不正确,因为_goalList和日期之类的内容仍然是对象,而不是Maps或Lists。您还需要在这些方法上实现toJson方法。

答案 1 :(得分:0)

对于任何想知道的人:我都有解决方案。

要使代码正常工作,我还需要在类toJson()上实现Goal方法(因为我在List<Goal>中使用了Week)。

class Goal{
  String _text;
  bool _reached;

  Map<String, dynamic> toJson() =>
  {
    'text': _text,
    'reached': _reached,
  }; 
}

此外,我需要像.toIso8601String()类中一样,向DateTime对象中添加Week

Map<String, dynamic> toJson() => 
  {
    'startDate': _startDate.toIso8601String(),
    'endDate': _endDate.toIso8601String(),
    'goalList': _goalList,
    'improvement': _improvement,
  };

现在输出为:

 {"startDate":"2019-05-27T00:00:00.000Z","endDate":"2019-06-02T00:00:00.000Z","goalList":[],"improvement":""}

答案 2 :(得分:-1)

此代码应该有效。

// Generated by 'yaml2podo'
// Version: 0.1.2
// https://pub.dev/packages/yaml2podo

final _jc = _JsonConverter();

class Goal {
  bool reached;
  String text;

  Goal();

  factory Goal.fromJson(Map map) {
    var result = Goal();
    result.reached = map['reached'] as bool;
    result.text = map['text'] as String;
    return result;
  }

  Map<String, dynamic> toJson() {
    var result = <String, dynamic>{};
    result['reached'] = reached;
    result['text'] = text;
    return result;
  }
}

class Week {
  DateTime endDate;
  DateTime startDate;
  String improvement;
  List<Goal> goalList;

  Week();

  factory Week.fromJson(Map map) {
    var result = Week();
    result.endDate = _jc.toDateTime(map['endDate']);
    result.startDate = _jc.toDateTime(map['startDate']);
    result.improvement = map['improvement'] as String;
    result.goalList =
        _jc.toList(map['goalList'], (e) => Goal.fromJson(e as Map));
    return result;
  }

  Map<String, dynamic> toJson() {
    var result = <String, dynamic>{};
    result['endDate'] = _jc.fromDateTime(endDate);
    result['startDate'] = _jc.fromDateTime(startDate);
    result['improvement'] = improvement;
    result['goalList'] = _jc.fromList(goalList, (e) => e.toJson());
    return result;
  }
}

class _JsonConverter {
  String fromDateTime(dynamic data) {
    if (data == null) {
      return null;
    }

    if (data is DateTime) {
      return data.toIso8601String();
    }

    return data as String;
  }

  List fromList(dynamic data, dynamic Function(dynamic) toJson) {
    if (data == null) {
      return null;
    }

    var result = [];
    for (var element in data) {
      var value;
      if (element != null) {
        value = toJson(element);
      }

      result.add(value);
    }

    return result;
  }

  Map<String, dynamic> fromMap(dynamic data, dynamic Function(dynamic) toJson) {
    if (data == null) {
      return null;
    }

    var result = <String, dynamic>{};
    for (var key in data.keys) {
      var value;
      var element = data[key];
      if (element != null) {
        value = toJson(element);
      }

      result[key.toString()] = value;
    }

    return result;
  }

  DateTime toDateTime(dynamic data) {
    if (data == null) {
      return null;
    }

    if (data is String) {
      return DateTime.parse(data);
    }

    return data as DateTime;
  }

  double toDouble(dynamic data) {
    if (data == null) {
      return null;
    }

    if (data is int) {
      return data.toDouble();
    }

    return data as double;
  }

  List<T> toList<T>(dynamic data, T Function(dynamic) fromJson) {
    if (data == null) {
      return null;
    }

    var result = <T>[];
    for (var element in data) {
      T value;
      if (element != null) {
        value = fromJson(element);
      }

      result.add(value);
    }

    return result;
  }

  Map<K, V> toMap<K extends String, V>(
      dynamic data, V Function(dynamic) fromJson) {
    if (data == null) {
      return null;
    }

    var result = <K, V>{};
    for (var key in data.keys) {
      V value;
      var element = data[key];
      if (element != null) {
        value = fromJson(element);
      }

      result[key.toString() as K] = value;
    }

    return result;
  }
}