省道对象->;无法转换为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)

我试图将一个对象序列化为JSON,然后再从JSON返回到另一个对象

这是应该为我提供正确JSON的代码片段:

 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年发布的,一年多以前,因此我再次询问它的原因,希望它从那时起得到修复。