首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Dart对象-> JSON字符串无法转换为JSON

Dart对象-> JSON字符串无法转换为JSON
EN

Stack Overflow用户
提问于 2015-01-02 08:35:23
回答 1查看 12.7K关注 0票数 4

我正在尝试将一个对象序列化为JSON,然后再从JSON返回到对象。

这是应该给我正确的JSON的代码片段:

代码语言:javascript
复制
 LoginRequest req = new LoginRequest();
    req.username = username;
    req.password = password;
    req.created = 123456;
    req.test = "KOTS";
    print(req.toString());

我在控制台上看到的是:

代码语言:javascript
复制
{} (:1)

在pubspec.yaml中,我将json_object作为依赖项导入:

代码语言:javascript
复制
environment:
  sdk: '>=1.0.0 <2.0.0'
dependencies:
  ...
  json_object: any

我有一个扩展JsonObject的基本消息类:

代码语言:javascript
复制
import 'package:json_object/json_object.dart';

class Message extends JsonObject {

  int created = new DateTime.now().millisecondsSinceEpoch;

}

然后我有一个扩展消息的LoginRequest:

代码语言:javascript
复制
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,所以我编写了另一个测试用例:

代码语言:javascript
复制
Message msg = new Message();
msg.created = 123456;
print(msg.toString());

这也是印刷:

代码语言:javascript
复制
{} (:1)

调用objectToJson也是如此:

代码语言:javascript
复制
objectToJson(msg).then((jsonStr) => print(jsonStr));
objectToJson(req).then((jsonStr) => print(jsonStr));

产出:

代码语言:javascript
复制
{}
{}

删除扩展JsonObject会导致上面的代码输出堆栈跟踪:

代码语言:javascript
复制
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)

导入省道:转换和使用JSON.encode做同样的事情:

代码语言:javascript
复制
import 'dart:convert' show JSON;

...

  print(JSON.encode(msg));
  print(JSON.encode(req));

产出:

代码语言:javascript
复制
{}
{}

如果删除扩展JsonObject,那么它将抛出堆栈跟踪:

代码语言:javascript
复制
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)

JsonObject仍然是将对象序列化为JSON和将JSON反序列化为对象的正确方式吗?(我在2013年的代码版权中看到了,这段代码现在已经很古老了)。如果是这样的话,我是否在我的课堂上遗漏了什么?

在省道烹饪书中,每个类都有自己的toJson方法,所有的值都手动复制到地图中,这很麻烦,如果我的整个应用程序都是JSON驱动的,那么我将花费大部分时间编写样板toJson / fromJson方法--这正是我想要避免的,因此选择dart的原因。

此外,我还看到了在StackOverflow上使用镜像的例子,后面跟着在dart2js中不完全支持镜像的注释--因为这是一个基于浏览器的应用程序,所以它能够编译成javascript是至关重要的。

更新

根据罗伯特的回答,做样板似乎是不可避免的:

Message.dart

代码语言:javascript
复制
import 'dart:convert' show JSON;

class Message {

  int created = new DateTime.now().millisecondsSinceEpoch;

  Map toJson() { 
    Map map = new Map();
    map["created"] = this.created;
    return map;
  }  

  String toString(){
    return JSON.encode(this);
  }

}

LoginRequest.dart

代码语言:javascript
复制
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;
  }  

}

测试代码:

代码语言:javascript
复制
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我只需要在消息类上实现一次,toJson将需要对每个类进行一次实现。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-01-02 08:47:41

我认为您的问题是使用print(req.toString());。你试过这样做吗?

objectToJson(req).then((jsonStr) => print(jsonStr));,也许这给了你一个json字符串。

我个人认为您实际上应该提供toJson/toObject方法,因为您可以完全控制序列化的内容以及序列化的方式(例如,排除私有字段、空值、.)。

//编辑

因为您使用了extends JsonObject toString(),所以返回一个空映射。

//编辑

https://code.google.com/p/dart/issues/detail?id=6490看起来不太受支持。但无论如何,您都不能使用json_object包。

例外:未明错误:类'_LocalClassMirror‘没有实例getter’getter‘。这应该是因为这个包需要实验镜像功能。

使用JSON.encode,您不能在其中放置一个对象。请参见encode

要么指定第二个参数,要么实现.toJson()

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27739434

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档