省道对象->;无法转换为JSON的JSON字符串
我试图将一个对象序列化为JSON,然后再从JSON返回到另一个对象 这是应该为我提供正确JSON的代码片段:省道对象->;无法转换为JSON的JSON字符串,json,dart,Json,Dart,我试图将一个对象序列化为JSON,然后再从JSON返回到另一个对象 这是应该为我提供正确JSON的代码片段: LoginRequest req = new LoginRequest(); req.username = username; req.password = password; req.created = 123456; req.test = "KOTS"; print(req.toString()); 我在控制台中看到的是: {} (:1)
LoginRequest req = new LoginRequest();
req.username = username;
req.password = password;
req.created = 123456;
req.test = "KOTS";
print(req.toString());
我在控制台中看到的是:
{} (:1)
在pubspec.yaml中,我将json_对象作为依赖项导入:
environment:
sdk: '>=1.0.0 <2.0.0'
dependencies:
...
json_object: any
然后我有一个LoginRequest,它扩展了消息:
import 'Message.dart';
class LoginRequest extends Message {
String _username;
String _password;
String test;
String get username => _username;
set username(String username) {
_username = username.trim();
}
String get password => _password;
set password(String password) {
_password = password.trim();
}
}
我认为只有基类才会转换为Json,所以我编写了另一个测试用例:
Message msg = new Message();
msg.created = 123456;
print(msg.toString());
这也是印刷:
{} (:1)
调用objectToJson执行相同的操作:
objectToJson(msg).then((jsonStr) => print(jsonStr));
objectToJson(req).then((jsonStr) => print(jsonStr));
import 'dart:convert' show JSON;
...
print(JSON.encode(msg));
print(JSON.encode(req));
产出:
{}
{}
{}
{}
删除extends JsonObject会导致上述代码喷出堆栈跟踪:
Exception: Uncaught Error: Converting object to an encodable object failed.
Stack Trace:
#0 _JsonStringifier.writeObject (dart:convert/json.dart:660)
#1 _JsonStringStringifier.printOn (dart:convert/json.dart:831)
#2 _JsonStringStringifier.stringify (dart:convert/json.dart:813)
#3 JsonEncoder.convert (dart:convert/json.dart:243)
#4 JsonCodec.encode (dart:convert/json.dart:141)
#5 login (package:falm/login-dialog.dart:47:22)
#6 Function.apply (dart:core-patch/function_patch.dart:28)
#7 GeneratedObjectAccessorService.invoke (package:smoke/static.dart:149:28)
#8 invoke (package:smoke/smoke.dart:43:41)
#9 HtmlElement&Polymer.dispatchMethod (package:polymer/src/instance.dart:1054:19)
#10 BindingDelegate&PolymerEventBindings.getEventHandler.<anonymous closure> (package:polymer/src/events.dart:82:32)
#11 _RootZone.runUnaryGuarded (dart:async/zone.dart:1093)
#12 _RootZone.bindUnaryCallback.<anonymous closure> (dart:async/zone.dart:1122)
#13 BindingDelegate&PolymerEventBindings.prepareEventBinding.<anonymous closure>.<anonymous closure> (package:polymer/src/events.dart:101:67)
Clicked Login (:1)
Exception: Uncaught Error: Class '_LocalClassMirror' has no instance getter 'getters'.
NoSuchMethodError: method not found: 'getters'
Receiver: Instance of '_LocalClassMirror'
Arguments: []
Stack Trace:
#0 Object.noSuchMethod (dart:core-patch/object_patch.dart:45)
#1 _serializeObject (package:json_object/src/mirror_based_serializer.dart:127:16)
#2 objectToSerializable (package:json_object/src/mirror_based_serializer.dart:53:21)
#3 objectToJson (package:json_object/src/mirror_based_serializer.dart:22:23)
#4 login (package:falm/login-dialog.dart:43:17)
#5 Function.apply (dart:core-patch/function_patch.dart:28)
#6 GeneratedObjectAccessorService.invoke (package:smoke/static.dart:149:28)
#7 invoke (package:smoke/smoke.dart:43:41)
#8 HtmlElement&Polymer.dispatchMethod (package:polymer/src/instance.dart:1054:19)
#9 BindingDelegate&PolymerEventBindings.getEventHandler.<anonymous closure> (package:polymer/src/events.dart:82:32)
#10 _RootZone.runUnaryGuarded (dart:async/zone.dart:1093)
#11 _RootZone.bindUnaryCallback.<anonymous closure> (dart:async/zone.dart:1122)
#12 BindingDelegate&PolymerEventBindings.prepareEventBinding.<anonymous closure>.<anonymous closure> (package:polymer/src/events.dart:101:67)
Clicked Login (:1)
Exception: Uncaught Error: Converting object to an encodable object failed.
Stack Trace:
#0 _JsonStringifier.writeObject (dart:convert/json.dart:660)
#1 _JsonStringStringifier.printOn (dart:convert/json.dart:831)
#2 _JsonStringStringifier.stringify (dart:convert/json.dart:813)
#3 JsonEncoder.convert (dart:convert/json.dart:243)
#4 JsonCodec.encode (dart:convert/json.dart:141)
#5 login (package:falm/login-dialog.dart:47:22)
#6 Function.apply (dart:core-patch/function_patch.dart:28)
#7 GeneratedObjectAccessorService.invoke (package:smoke/static.dart:149:28)
#8 invoke (package:smoke/smoke.dart:43:41)
#9 HtmlElement&Polymer.dispatchMethod (package:polymer/src/instance.dart:1054:19)
#10 BindingDelegate&PolymerEventBindings.getEventHandler.<anonymous closure> (package:polymer/src/events.dart:82:32)
#11 _RootZone.runUnaryGuarded (dart:async/zone.dart:1093)
#12 _RootZone.bindUnaryCallback.<anonymous closure> (dart:async/zone.dart:1122)
#13 BindingDelegate&PolymerEventBindings.prepareEventBinding.<anonymous closure>.<anonymous closure> (package:polymer/src/events.dart:101:67)
Clicked Login (:1)
Exception: Uncaught Error: Class '_LocalClassMirror' has no instance getter 'getters'.
NoSuchMethodError: method not found: 'getters'
Receiver: Instance of '_LocalClassMirror'
Arguments: []
Stack Trace:
#0 Object.noSuchMethod (dart:core-patch/object_patch.dart:45)
#1 _serializeObject (package:json_object/src/mirror_based_serializer.dart:127:16)
#2 objectToSerializable (package:json_object/src/mirror_based_serializer.dart:53:21)
#3 objectToJson (package:json_object/src/mirror_based_serializer.dart:22:23)
#4 login (package:falm/login-dialog.dart:44:17)
#5 Function.apply (dart:core-patch/function_patch.dart:28)
#6 GeneratedObjectAccessorService.invoke (package:smoke/static.dart:149:28)
#7 invoke (package:smoke/smoke.dart:43:41)
#8 HtmlElement&Polymer.dispatchMethod (package:polymer/src/instance.dart:1054:19)
#9 BindingDelegate&PolymerEventBindings.getEventHandler.<anonymous closure> (package:polymer/src/events.dart:82:32)
#10 _RootZone.runUnaryGuarded (dart:async/zone.dart:1093)
#11 _RootZone.bindUnaryCallback.<anonymous closure> (dart:async/zone.dart:1122)
#12 BindingDelegate&PolymerEventBindings.prepareEventBinding.<anonymous closure>.<anonymous closure> (package:polymer/src/events.dart:101:67)
Exception: Uncaught Error: Converting object to an encodable object failed.
Stack Trace:
#0 _JsonStringifier.writeObject (dart:convert/json.dart:660)
#1 _JsonStringStringifier.printOn (dart:convert/json.dart:831)
#2 _JsonStringStringifier.stringify (dart:convert/json.dart:813)
#3 JsonEncoder.convert (dart:convert/json.dart:243)
#4 JsonCodec.encode (dart:convert/json.dart:141)
#5 login (package:falm/login-dialog.dart:47:22)
#6 Function.apply (dart:core-patch/function_patch.dart:28)
#7 GeneratedObjectAccessorService.invoke (package:smoke/static.dart:149:28)
#8 invoke (package:smoke/smoke.dart:43:41)
#9 HtmlElement&Polymer.dispatchMethod (package:polymer/src/instance.dart:1054:19)
#10 BindingDelegate&PolymerEventBindings.getEventHandler.<anonymous closure> (package:polymer/src/events.dart:82:32)
#11 _RootZone.runUnaryGuarded (dart:async/zone.dart:1093)
#12 _RootZone.bindUnaryCallback.<anonymous closure> (dart:async/zone.dart:1122)
#13 BindingDelegate&PolymerEventBindings.prepareEventBinding.<anonymous closure>.<anonymous closure> (package:polymer/src/events.dart:101:67)
Clicked Login (:1)
Exception: Uncaught Error: Class '_LocalClassMirror' has no instance getter 'getters'.
NoSuchMethodError: method not found: 'getters'
Receiver: Instance of '_LocalClassMirror'
Arguments: []
Stack Trace:
#0 Object.noSuchMethod (dart:core-patch/object_patch.dart:45)
#1 _serializeObject (package:json_object/src/mirror_based_serializer.dart:127:16)
#2 objectToSerializable (package:json_object/src/mirror_based_serializer.dart:53:21)
#3 objectToJson (package:json_object/src/mirror_based_serializer.dart:22:23)
#4 login (package:falm/login-dialog.dart:43:17)
#5 Function.apply (dart:core-patch/function_patch.dart:28)
#6 GeneratedObjectAccessorService.invoke (package:smoke/static.dart:149:28)
#7 invoke (package:smoke/smoke.dart:43:41)
#8 HtmlElement&Polymer.dispatchMethod (package:polymer/src/instance.dart:1054:19)
#9 BindingDelegate&PolymerEventBindings.getEventHandler.<anonymous closure> (package:polymer/src/events.dart:82:32)
#10 _RootZone.runUnaryGuarded (dart:async/zone.dart:1093)
#11 _RootZone.bindUnaryCallback.<anonymous closure> (dart:async/zone.dart:1122)
#12 BindingDelegate&PolymerEventBindings.prepareEventBinding.<anonymous closure>.<anonymous closure> (package:polymer/src/events.dart:101:67)
Clicked Login (:1)
Exception: Uncaught Error: Converting object to an encodable object failed.
Stack Trace:
#0 _JsonStringifier.writeObject (dart:convert/json.dart:660)
#1 _JsonStringStringifier.printOn (dart:convert/json.dart:831)
#2 _JsonStringStringifier.stringify (dart:convert/json.dart:813)
#3 JsonEncoder.convert (dart:convert/json.dart:243)
#4 JsonCodec.encode (dart:convert/json.dart:141)
#5 login (package:falm/login-dialog.dart:47:22)
#6 Function.apply (dart:core-patch/function_patch.dart:28)
#7 GeneratedObjectAccessorService.invoke (package:smoke/static.dart:149:28)
#8 invoke (package:smoke/smoke.dart:43:41)
#9 HtmlElement&Polymer.dispatchMethod (package:polymer/src/instance.dart:1054:19)
#10 BindingDelegate&PolymerEventBindings.getEventHandler.<anonymous closure> (package:polymer/src/events.dart:82:32)
#11 _RootZone.runUnaryGuarded (dart:async/zone.dart:1093)
#12 _RootZone.bindUnaryCallback.<anonymous closure> (dart:async/zone.dart:1122)
#13 BindingDelegate&PolymerEventBindings.prepareEventBinding.<anonymous closure>.<anonymous closure> (package:polymer/src/events.dart:101:67)
产出:
{}
{}
{}
{}
如果删除extends JsonObject,它将抛出堆栈跟踪:
Exception: Uncaught Error: Converting object to an encodable object failed.
Stack Trace:
#0 _JsonStringifier.writeObject (dart:convert/json.dart:660)
#1 _JsonStringStringifier.printOn (dart:convert/json.dart:831)
#2 _JsonStringStringifier.stringify (dart:convert/json.dart:813)
#3 JsonEncoder.convert (dart:convert/json.dart:243)
#4 JsonCodec.encode (dart:convert/json.dart:141)
#5 login (package:falm/login-dialog.dart:47:22)
#6 Function.apply (dart:core-patch/function_patch.dart:28)
#7 GeneratedObjectAccessorService.invoke (package:smoke/static.dart:149:28)
#8 invoke (package:smoke/smoke.dart:43:41)
#9 HtmlElement&Polymer.dispatchMethod (package:polymer/src/instance.dart:1054:19)
#10 BindingDelegate&PolymerEventBindings.getEventHandler.<anonymous closure> (package:polymer/src/events.dart:82:32)
#11 _RootZone.runUnaryGuarded (dart:async/zone.dart:1093)
#12 _RootZone.bindUnaryCallback.<anonymous closure> (dart:async/zone.dart:1122)
#13 BindingDelegate&PolymerEventBindings.prepareEventBinding.<anonymous closure>.<anonymous closure> (package:polymer/src/events.dart:101:67)
Clicked Login (:1)
Exception: Uncaught Error: Class '_LocalClassMirror' has no instance getter 'getters'.
NoSuchMethodError: method not found: 'getters'
Receiver: Instance of '_LocalClassMirror'
Arguments: []
Stack Trace:
#0 Object.noSuchMethod (dart:core-patch/object_patch.dart:45)
#1 _serializeObject (package:json_object/src/mirror_based_serializer.dart:127:16)
#2 objectToSerializable (package:json_object/src/mirror_based_serializer.dart:53:21)
#3 objectToJson (package:json_object/src/mirror_based_serializer.dart:22:23)
#4 login (package:falm/login-dialog.dart:43:17)
#5 Function.apply (dart:core-patch/function_patch.dart:28)
#6 GeneratedObjectAccessorService.invoke (package:smoke/static.dart:149:28)
#7 invoke (package:smoke/smoke.dart:43:41)
#8 HtmlElement&Polymer.dispatchMethod (package:polymer/src/instance.dart:1054:19)
#9 BindingDelegate&PolymerEventBindings.getEventHandler.<anonymous closure> (package:polymer/src/events.dart:82:32)
#10 _RootZone.runUnaryGuarded (dart:async/zone.dart:1093)
#11 _RootZone.bindUnaryCallback.<anonymous closure> (dart:async/zone.dart:1122)
#12 BindingDelegate&PolymerEventBindings.prepareEventBinding.<anonymous closure>.<anonymous closure> (package:polymer/src/events.dart:101:67)
Clicked Login (:1)
Exception: Uncaught Error: Converting object to an encodable object failed.
Stack Trace:
#0 _JsonStringifier.writeObject (dart:convert/json.dart:660)
#1 _JsonStringStringifier.printOn (dart:convert/json.dart:831)
#2 _JsonStringStringifier.stringify (dart:convert/json.dart:813)
#3 JsonEncoder.convert (dart:convert/json.dart:243)
#4 JsonCodec.encode (dart:convert/json.dart:141)
#5 login (package:falm/login-dialog.dart:47:22)
#6 Function.apply (dart:core-patch/function_patch.dart:28)
#7 GeneratedObjectAccessorService.invoke (package:smoke/static.dart:149:28)
#8 invoke (package:smoke/smoke.dart:43:41)
#9 HtmlElement&Polymer.dispatchMethod (package:polymer/src/instance.dart:1054:19)
#10 BindingDelegate&PolymerEventBindings.getEventHandler.<anonymous closure> (package:polymer/src/events.dart:82:32)
#11 _RootZone.runUnaryGuarded (dart:async/zone.dart:1093)
#12 _RootZone.bindUnaryCallback.<anonymous closure> (dart:async/zone.dart:1122)
#13 BindingDelegate&PolymerEventBindings.prepareEventBinding.<anonymous closure>.<anonymous closure> (package:polymer/src/events.dart:101:67)
Clicked Login (:1)
Exception: Uncaught Error: Class '_LocalClassMirror' has no instance getter 'getters'.
NoSuchMethodError: method not found: 'getters'
Receiver: Instance of '_LocalClassMirror'
Arguments: []
Stack Trace:
#0 Object.noSuchMethod (dart:core-patch/object_patch.dart:45)
#1 _serializeObject (package:json_object/src/mirror_based_serializer.dart:127:16)
#2 objectToSerializable (package:json_object/src/mirror_based_serializer.dart:53:21)
#3 objectToJson (package:json_object/src/mirror_based_serializer.dart:22:23)
#4 login (package:falm/login-dialog.dart:44:17)
#5 Function.apply (dart:core-patch/function_patch.dart:28)
#6 GeneratedObjectAccessorService.invoke (package:smoke/static.dart:149:28)
#7 invoke (package:smoke/smoke.dart:43:41)
#8 HtmlElement&Polymer.dispatchMethod (package:polymer/src/instance.dart:1054:19)
#9 BindingDelegate&PolymerEventBindings.getEventHandler.<anonymous closure> (package:polymer/src/events.dart:82:32)
#10 _RootZone.runUnaryGuarded (dart:async/zone.dart:1093)
#11 _RootZone.bindUnaryCallback.<anonymous closure> (dart:async/zone.dart:1122)
#12 BindingDelegate&PolymerEventBindings.prepareEventBinding.<anonymous closure>.<anonymous closure> (package:polymer/src/events.dart:101:67)
Exception: Uncaught Error: Converting object to an encodable object failed.
Stack Trace:
#0 _JsonStringifier.writeObject (dart:convert/json.dart:660)
#1 _JsonStringStringifier.printOn (dart:convert/json.dart:831)
#2 _JsonStringStringifier.stringify (dart:convert/json.dart:813)
#3 JsonEncoder.convert (dart:convert/json.dart:243)
#4 JsonCodec.encode (dart:convert/json.dart:141)
#5 login (package:falm/login-dialog.dart:47:22)
#6 Function.apply (dart:core-patch/function_patch.dart:28)
#7 GeneratedObjectAccessorService.invoke (package:smoke/static.dart:149:28)
#8 invoke (package:smoke/smoke.dart:43:41)
#9 HtmlElement&Polymer.dispatchMethod (package:polymer/src/instance.dart:1054:19)
#10 BindingDelegate&PolymerEventBindings.getEventHandler.<anonymous closure> (package:polymer/src/events.dart:82:32)
#11 _RootZone.runUnaryGuarded (dart:async/zone.dart:1093)
#12 _RootZone.bindUnaryCallback.<anonymous closure> (dart:async/zone.dart:1122)
#13 BindingDelegate&PolymerEventBindings.prepareEventBinding.<anonymous closure>.<anonymous closure> (package:polymer/src/events.dart:101:67)
Clicked Login (:1)
Exception: Uncaught Error: Class '_LocalClassMirror' has no instance getter 'getters'.
NoSuchMethodError: method not found: 'getters'
Receiver: Instance of '_LocalClassMirror'
Arguments: []
Stack Trace:
#0 Object.noSuchMethod (dart:core-patch/object_patch.dart:45)
#1 _serializeObject (package:json_object/src/mirror_based_serializer.dart:127:16)
#2 objectToSerializable (package:json_object/src/mirror_based_serializer.dart:53:21)
#3 objectToJson (package:json_object/src/mirror_based_serializer.dart:22:23)
#4 login (package:falm/login-dialog.dart:43:17)
#5 Function.apply (dart:core-patch/function_patch.dart:28)
#6 GeneratedObjectAccessorService.invoke (package:smoke/static.dart:149:28)
#7 invoke (package:smoke/smoke.dart:43:41)
#8 HtmlElement&Polymer.dispatchMethod (package:polymer/src/instance.dart:1054:19)
#9 BindingDelegate&PolymerEventBindings.getEventHandler.<anonymous closure> (package:polymer/src/events.dart:82:32)
#10 _RootZone.runUnaryGuarded (dart:async/zone.dart:1093)
#11 _RootZone.bindUnaryCallback.<anonymous closure> (dart:async/zone.dart:1122)
#12 BindingDelegate&PolymerEventBindings.prepareEventBinding.<anonymous closure>.<anonymous closure> (package:polymer/src/events.dart:101:67)
Clicked Login (:1)
Exception: Uncaught Error: Converting object to an encodable object failed.
Stack Trace:
#0 _JsonStringifier.writeObject (dart:convert/json.dart:660)
#1 _JsonStringStringifier.printOn (dart:convert/json.dart:831)
#2 _JsonStringStringifier.stringify (dart:convert/json.dart:813)
#3 JsonEncoder.convert (dart:convert/json.dart:243)
#4 JsonCodec.encode (dart:convert/json.dart:141)
#5 login (package:falm/login-dialog.dart:47:22)
#6 Function.apply (dart:core-patch/function_patch.dart:28)
#7 GeneratedObjectAccessorService.invoke (package:smoke/static.dart:149:28)
#8 invoke (package:smoke/smoke.dart:43:41)
#9 HtmlElement&Polymer.dispatchMethod (package:polymer/src/instance.dart:1054:19)
#10 BindingDelegate&PolymerEventBindings.getEventHandler.<anonymous closure> (package:polymer/src/events.dart:82:32)
#11 _RootZone.runUnaryGuarded (dart:async/zone.dart:1093)
#12 _RootZone.bindUnaryCallback.<anonymous closure> (dart:async/zone.dart:1122)
#13 BindingDelegate&PolymerEventBindings.prepareEventBinding.<anonymous closure>.<anonymous closure> (package:polymer/src/events.dart:101:67)
登录请求
import 'Message.dart';
class LoginRequest extends Message {
String _username;
String _password;
String test;
String get username => _username;
set username(String username) {
_username = username.trim();
}
String get password => _password;
set password(String password) {
_password = password.trim();
}
Map toJson() {
Map map = super.toJson();
map["username"] = this.username;
map["password"] = this.password;
return map;
}
}
测试代码:
LoginRequest req = new LoginRequest();
req.username = username;
req.password = password;
req.created = 123456;
req.test = "KOTS";
print(req);
// outputs: {"created":123456,"username":"asdfasdf","password":"adfasdf"} (:1)
Message msg = new Message();
msg.created = 123456;
print(msg);
// outputs: {"created":123456} (:1)
toString我只需要在Message类上实现一次,toJson将需要在每个类上实现。我认为您的问题在于您使用了
print(req.toString())代码>。您是否尝试过这样做:
objectToJson(req)。然后((jsonStr)=>print(jsonStr))代码>也许这会给你一个json字符串
我个人觉得您实际上应该提供一个toJson/toObject方法,因为您可以完全控制序列化内容和序列化方式(例如,排除私有字段、空值等)
//编辑
因为您使用扩展JsonObject
toString()返回一个空映射
//编辑
看起来没有得到很好的支持。但是无论如何,您都不能使用json_对象包
异常:未捕获错误:类“\u LocalClassMirror”没有实例getter“getter”。这应该是因为软件包需要实验性的镜像功能
使用JSON.encode
不能将对象放入其中。见:
指定第二个参数或实现.toJson()
已经尝试过,如我更新的问题所示,仍然输出{}。请尝试删除扩展JsonObject
。这样做会抛出堆栈跟踪,我已经用包含的堆栈跟踪更新了我的问题。实现toJson似乎是最干净的解决方案,尽管它需要一些样板文件。我已经用toJson实现更新了我的问题,谢谢Robert!使用JsonObject/json_对象看起来开销很大。最好编写自己的函数或基于镜像的序列化。dart2js支持镜像吗?上次我查看时,人们评论说它在dart2js中没有完全实现,这意味着我不能在前端使用它。我也看到了这个:我看到了那篇文章,但那是在2013年发布的,一年多以前,因此我再次询问它的原因,希望它从那时起得到修复。