Когда дело доходит до кодирования JSON в Dart, за сообщение Сета Лэдда, наконец, официально утвержденный официальный путь - dart:convert
+ JSON.Encode
.
Скажем, у нас есть куча классов моделей (PODO s), например:
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
для каждого из моих классов моделей или есть лучший способ?
EDIT: это простая сериализация, которую я ищу:
{
"Id": 17,
"Name": "John"
}
Сравните с toJson
в ServiceStack.Text, например.
Dart serialization библиотека (см. ниже ответ Matt B) выглядит как шаг в правильном направлении. Однако это...
var serialization = new Serialization()
..addRuleFor(Customer);
var json = JSON.encode(serialization.write(customer, format: new SimpleJsonFormat()));
... создает только массив со значениями (без ключей):
[17,"John"]
С помощью SimpleMapFormat по умолчанию создается этот complex.
Я еще не нашел то, что искал...
EDIT 2: добавление некоторого контекста: я создаю веб-службу RESTful в Dart, и я ищу сериализацию JSON, которая может быть легко использована любым клиентом, а не только другим Dart клиент. Например, запрос к API-интерфейсу стека для этого самого вопроса создаст этот ответ JSON. Это формат сериализации, который я ищу. - Или посмотрите типичные ответы JSON, возвращенные Twitter REST API или Facebook Graph API.
EDIT 3: я написал небольшую статью в блоге об этом. См. Также обсуждение в Hacker News.