2015-01-02 2 views
0

Я пытаюсь преобразовать объект в JSON, а затем обратно из JSON в объект снова.Объект Dart -> JSON String не удается преобразовать в 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_object как зависимость:

environment: 
    sdk: '>=1.0.0 <2.0.0' 
dependencies: 
    ... 
    json_object: any 

у меня есть базовый класс, который расширяет сообщение JSONObject:

import 'package:json_object/json_object.dart'; 

class Message extends JsonObject { 

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

} 

, а затем у меня есть 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)); 

Выходы:

{} 
{} 

Удаление расширяет 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) 

Импорт дротик: конвертирование и использование JSON .encode делает то же самое:

import 'dart:convert' show JSON; 

... 

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

Выходы:

{} 
{} 

Если я удалить расширяет 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) 

Is JSONObject еще правильный путь для сериализации объектов в JSON и десериализации JSON к объектам ? (Я вижу в коде copyright 2013, который является древним к настоящему времени). Если да, я что-то пропускаю в своих классах?

В учебнике по варке есть примеры, когда каждый класс имеет свой собственный метод toson и где все значения вручную скопированы в карту, это громоздко, если все мое приложение JSON-driven, тогда я буду тратить большую часть моего времени пишут шаблоны toJson/fromJson методы - это именно то, что я пытаюсь уйти отсюда, поэтому причина выбора дротика.

Кроме того, я вижу примеры в StackOverflow, где используются зеркала, а затем комментарии, что зеркала не полностью поддерживаются в dart2js - так как это приложение на основе браузера, крайне важно, чтобы он мог скомпилировать javascript.

Update:

На основании ответа Роберта, кажется, делает шаблонного неизбежна:

Message.dart

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

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; 
    } 

} 

Test код:

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 нужно будет выполнять каждый класс.

+0

Использование JsonObject/json_object выглядит как много накладных расходов. Лучше напишите свою собственную функцию или зеркала, основанные на сериализации. – Robert

+0

Поддерживаются ли зеркала в dart2js? В прошлый раз, когда я проверял, что люди отметили, что это не полностью реализовано в dart2js, это означает, что я не могу использовать его во внешнем интерфейсе. –

+0

См. Мой ответ :) – Robert

ответ

1

Думаю, ваша проблема в том, что вы используете print(req.toString());. Вы пытались сделать это:

objectToJson(req).then((jsonStr) => print(jsonStr)); Возможно, это дает вам строку json.

Я лично считаю, что вам действительно ДОЛЖЕН предоставить метод toJson/toObject, потому что у вас есть полный контроль над сериализацией и его сериализацией (например, исключить частные поля, нулевые значения ...).

// EDIT

Поскольку вы используете extends JsonObject ToString() возвращает пустую карту.

// EDIT

https://code.google.com/p/dart/issues/detail?id=6490 не выглядит, как она поддерживается хорошо. Но тогда вы не можете использовать пакет json_object.

Исключение: ошибка с нечистотой: класс '_LocalClassMirror' не имеет экземпляров getter 'getters'. Это должно быть потому, что пакет требует экспериментальных функций зеркала.

Используя JSON.encode, вы не можете поместить туда объект. См. https://api.dartlang.org/apidocs/channels/stable/dartdoc-viewer/dart:convert.JsonCodec#id_encode:

Вы указываете второй параметр или реализуете .toJson().

+0

Уже пробовал, что, как показано в моем обновленном вопросе, все еще выводит {} –

+0

Попробуйте удалить 'extends JsonObject', пожалуйста. – Robert

+0

Выполнение этой задачи трассировки стека, я обновил свой вопрос с включенной трассировкой стека. –

Смежные вопросы