首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >将JSON序列化程序添加到每个模型类?

将JSON序列化程序添加到每个模型类?
EN

Stack Overflow用户
提问于 2013-11-17 05:46:33
回答 8查看 24.5K关注 0票数 55

当涉及到在Dart中的JSON编码时,根据Seth Ladd's accouncement,最终批准的官方方式是dart:convert + JSON.Encode

假设我们有一堆模型类(PODO),如下所示:

class Customer
{
  int Id;
  String Name;
}

现在,我希望能够像这样对我的域对象进行JSON编码:

var customer = new Customer()
  ..Id = 17
  ..Name = "John";
var json = JSON.encode(customer);

不幸的是,这是行不通的。

Uncaught Error: Converting object to an encodable object failed.
Stack Trace: 
#0      _JsonStringifier.stringifyValue (dart:convert/json.dart:416)
#1      _JsonStringifier.stringify (dart:convert/json.dart:336)
#2      JsonEncoder.convert (dart:convert/json.dart:177)
....

..。除非我们显式地告诉dart:convert如何编码:

class Customer
{
  int Id;
  String Name;

  Map toJson() { 
    Map map = new Map();
    map["Id"] = Id;
    map["Name"] = Name;
    return map;
  }  
}

我真的需要为我的每个模型类添加一个toJson方法吗?或者有没有更好的方法?

编辑:这是我正在寻找的简单序列化:

{
    "Id": 17,
    "Name": "John"
}

例如,与ServiceStack.Text中的ToJson相比。

Dart的serialization库(参见下面Matt B的答案)似乎是朝着正确方向迈出的一步。但是这..。

var serialization = new Serialization()
  ..addRuleFor(Customer); 
var json = JSON.encode(serialization.write(customer, format: new SimpleJsonFormat()));

..。只生成一个包含值的数组(没有键):

[17,"John"]

另一方面,使用默认的SimpleMapFormat生成此complex表示。

还没找到我要找的..。

JSON 2:添加一些上下文:我正在用Dart构建JSON服务,我正在寻找一个RESTful序列化,它可以很容易地被任何客户端使用,而不仅仅是另一个Dart客户端。例如,针对这个问题查询Stack Exchange API将创建this JSON response。这就是我正在寻找的序列化格式。-或者,查看由Twitter REST APIFacebook Graph API返回的典型JSON响应。

EDIT 3:我写了一个关于这方面的小blog post。另请参阅黑客新闻上的discussion

EN

回答 8

Stack Overflow用户

发布于 2013-12-08 23:10:01

我编写了Exportable库来解决诸如转换为Map或JSON之类的问题。使用它,模型声明看起来像这样:

import 'package:exportable/exportable.dart';

class Customer extends Object with Exportable {
  @export int id;
  @export String name;
}

如果你想转换成JSON,你可以:

String jsonString = customer.toJson();

此外,从JSON字符串初始化新对象也很容易:

Customer customer = new Customer()..initFromJson(jsonString);

或者:

Customer customer = new Exportable(Customer, jsonString);

有关更多信息,请参阅README

票数 14
EN

Stack Overflow用户

发布于 2013-11-17 07:33:20

另一种方法是使用Serialization package并为您的类添加规则。最基本的形式是使用反射自动获取属性。

票数 7
EN

Stack Overflow用户

发布于 2015-04-07 03:40:14

Redstone mapper是我用过的最好的序列化库。JsonObject和Exportable的缺点是您必须扩展它们的一些类。使用Redstone Mapper,您可以拥有这样的结构

class News
{
    @Field() String title;
    @Field() String text;
    @Field() List<FileDb> images;
    @Field() String link; 
}

它可以与getter和setter一起使用,你可以通过不使用@Field()注释来隐藏信息,你可以将字段从/重命名为json,拥有嵌套的对象,它可以在服务器和客户端工作。它还与Redstone Server框架集成在一起,在Redstone Server框架中,它具有对MongoDB进行编码/解码的助手。

我所见过的唯一一个方向正确的框架是Dartson,但与Redstone Mapper相比,它仍然缺乏一些功能。

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

https://stackoverflow.com/questions/20024298

复制
相关文章

相似问题

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