将对象转换为可编码对象失败
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<…>
我的'Patient'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);
}
}
您不能将任意 class 实例转换为 JSON。
这是因为 Flutter 不支持反射。 因此,flutter 应用程序中的任何 dart 程序都无法确定 class 具有哪些属性。因此,在Flutter中没有魔法可以序列化任意对象。
一个选项是为 JsonEncoder() 构造函数提供自定义函数(通过 toEncodable
参数)。此自定义函数应将您的自定义对象映射到 JsonEncoder 已经知道如何处理的类型(即数字、字符串、布尔值、null、列表和带有字符串键的映射)。
也许 reflectable 插件在这里有用。
https://api.dartlang.org/stable/1.24.3/dart-convert/JsonEncoder-class.html
https://pub.dartlang.org/packages/json_serializable 是一个为它生成代码的包,这样你就不需要手动编写它了。
就我而言,我试图在地图对象中使用整数键。
一旦我将它转换为字符串,错误就解决了。祝你好运。
您不需要添加任何库。您只需在您的对象中实现 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"}]
就我而言,我试图将 DateTime 直接添加到地图对象。一旦我将它转换为字符串,错误就解决了。
之前
return {
'birthDay', instance.birthDay
};
现在
return {
'birthDay', instance.birthDay?.toIso8601String(),
};
我试图在 dio 请求参数的映射中使用 Uri
。将其转换为字符串解决了这个问题。
直接使用 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({}); }
我收到以下错误:
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<…>
我的'Patient'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);
}
}
您不能将任意 class 实例转换为 JSON。
这是因为 Flutter 不支持反射。 因此,flutter 应用程序中的任何 dart 程序都无法确定 class 具有哪些属性。因此,在Flutter中没有魔法可以序列化任意对象。
一个选项是为 JsonEncoder() 构造函数提供自定义函数(通过 toEncodable
参数)。此自定义函数应将您的自定义对象映射到 JsonEncoder 已经知道如何处理的类型(即数字、字符串、布尔值、null、列表和带有字符串键的映射)。
也许 reflectable 插件在这里有用。
https://api.dartlang.org/stable/1.24.3/dart-convert/JsonEncoder-class.html
https://pub.dartlang.org/packages/json_serializable 是一个为它生成代码的包,这样你就不需要手动编写它了。
就我而言,我试图在地图对象中使用整数键。 一旦我将它转换为字符串,错误就解决了。祝你好运。
您不需要添加任何库。您只需在您的对象中实现 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"}]
就我而言,我试图将 DateTime 直接添加到地图对象。一旦我将它转换为字符串,错误就解决了。
之前
return {
'birthDay', instance.birthDay
};
现在
return {
'birthDay', instance.birthDay?.toIso8601String(),
};
我试图在 dio 请求参数的映射中使用 Uri
。将其转换为字符串解决了这个问题。
直接使用 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({}); }