当涉及到在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 API或Facebook Graph API返回的典型JSON响应。
EDIT 3:我写了一个关于这方面的小blog post。另请参阅黑客新闻上的discussion。
发布于 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。
发布于 2013-11-17 07:33:20
另一种方法是使用Serialization package并为您的类添加规则。最基本的形式是使用反射自动获取属性。
发布于 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相比,它仍然缺乏一些功能。
https://stackoverflow.com/questions/20024298
复制相似问题