繁体   English   中英

将 object 转换为可编码的 object 失败

[英]Converting object to an encodable object failed

我收到以下错误:

Converting object to an encodable object failed: Instance of 'Patient'
#0      _JsonStringifier.writeObject (dart:convert/json.dart:674)
#1      _JsonStringifier.writeList (dart:convert/json.dart:724)
#2      _JsonStringifier.writeJsonValue (dart:convert/json.dart:706)
#3      _JsonStringifier.writeObject (dart:convert/json.dart:664)
#4      _JsonStringStringifier.printOn (dart:convert/json.dart:873)
#5      _JsonStringStringifier.stringify (dart:convert/json.dart:855)
#6      JsonEncoder.convert (dart:convert/json.dart:256)
#7      JsonCodec.encode (dart:convert/json.dart:155)
#8      Persistence.saveLatestPatients (/Users/dean/Library/Developer/CoreSimulator/Devices/570CC18D-95BF-4062-8523-9C78E106D0CF/data/Containers/Data/Application/70CAEFAA-4AE3-4CBF-A85F-39161E472C83/tmp/flutter_prototypev6jYbr/flutter_prototype/lib/utils/persistence.dart:32:23)
<asynchronous suspension>
#9      _HomeScreenState.fetchData.<anonymous closure> (/Users/dean/Librar<…>

我的“病人”class:

import 'package:simple_moment/simple_moment.dart';

class Patient {
  String guid;
  String _name;
  String _surname;
  DateTime _updated;

  Patient(String guid) {
    this.guid = guid;
  }

  String get name => _name;
  set name(v) => _name = v;

  String get surname => _surname;
  set surname(v) => _surname = v;

  DateTime get updated => _updated;
  set updated(v) => _updated = v;

  // Helper functions

  String getFullName() => '$_name $_surname';

  String getRelativeLastUpdated() {
    var moment = new Moment.now();
    return moment.from(_updated);
  }

}

您不需要添加任何库。 你只需要在你的对象中实现 fromJson 和 toJson 函数。

示例:

class LinkItem {
  final String name;
  final String url;

  LinkItem({this.name, this.url});

  LinkItem.fromJson(Map<String, dynamic> json)
      : name = json['n'],
        url = json['u'];

  Map<String, dynamic> toJson() {
    return {
      'n': name,
      'u': url,
    };
  }
}

然后你可以调用jsonEncode:

List<LinkItem> list = await getUserLinks();
list.add(linkItem);    
String json = jsonEncode(list);

结果:

  [{"n":"Google","u":"https://www.google.com/"},{"n":"Test","u":"https://www.test.com/"},{"n":"etc","u":"etc"}]

您不能只是将任意类实例转换为 JSON。

一种选择是为 JsonEncoder() 构造函数提供自定义函数(通过toEncodable参数)。 这个自定义函数应该将您的自定义对象映射到 JsonEncoder 已经知道如何处理的类型(即数字、字符串、布尔值、空值、列表和带有字符串键的映射)。

https://api.dartlang.org/stable/1.24.3/dart-convert/JsonEncoder-class.html

https://pub.dartlang.org/packages/json_serializable是一个为此生成代码的包,因此您无需手动编写它。

另见https://flutter.io/json/

就我而言,我试图在地图对象中使用整数键。 一旦我将它转换为字符串,错误就解决了。 祝你好运。

就我而言,我试图将 DateTime 直接添加到地图对象。 一旦我将它转换为字符串,错误就解决了。

之前

return {
  'birthDay', instance.birthDay
};

现在

return {
   'birthDay', instance.birthDay?.toIso8601String(),
};

我试图在 dio 请求参数的映射中使用一个Uri 将其转换为 String 解决了该问题。

直接使用redirectUrl作为Uri的实例时出错

data: {
      'client_id': identifier,
      'client_secret': secret,
      'code': code,
      'redirect_uri': redirectUrl
    });

转换为String后没有错误。

data: {
      'client_id': identifier,
      'client_secret': secret,
      'code': code,
      'redirect_uri': redirectUrl.toString()
    });
    

就我而言,我在形成 json 请求时添加了多个 '{' 大括号。 取下牙套后,效果很好。

jsonEncode({
{
  'isAnonymous': request.isAnonymous,
}});

就我而言,

return file.writeAsString(jsonEncode(addNewScore(scorer, s)));

jsonEncode抛出错误Converting object to an encodable object failed: _LinkedHashMap len:1

{ turnoff: { times: { 15: [ {score: 6, ts: 1640916433851}]}}} <-- 这里 15 实际上是int

所以在将该属性从int转换为String能够正确获取

{“关闭”:{“时间”:{“15”:[{“分数”:6,“ts”:1640916433851}]}}}

JSON 不允许整数键或属性

将名为 toJson() 的方法添加到您需要进行转换的 class 中。 将转换逻辑放入该方法并使用this.propety_name来引用属性。 看这里的方法示例String toJson() { return jsonEncode({}); } String toJson() { return jsonEncode({}); }

**有时它会显示,因为我们没有使用 controller 添加.text 例如**

它必须看起来像下面提到的“电话”:textEditingController_PhoneNum.text,

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM