На данный момент лучшим вариантом является, вероятно, использование библиотеки Smoke.
Это подмножество функциональности Зеркала, но имеет как реализацию на основе зеркал, так и реализацию на основе кодека. Это написано командой PolymerDart, поэтому он близок к «Официальному», как мы собираемся получить.
При разработке он будет использовать кодировку/декодирование на основе зеркал; но для публикации вы можете создать небольшой трансформатор, который будет генерировать код.
Сет Лэдд создал a code sample here, который я extended slightly для поддержки детей-объекты: (., Например, для поддержки списка)
abstract class Serializable {
static fromJson(Type t, Map json) {
var typeMirror = reflectType(t);
T obj = typeMirror.newInstance(new Symbol(""), const[]).reflectee;
json.forEach((k, v) {
if (v is Map) {
var d = smoke.getDeclaration(t, smoke.nameToSymbol(k));
smoke.write(obj, smoke.nameToSymbol(k), Serializable.fromJson(d.type, v));
} else {
smoke.write(obj, smoke.nameToSymbol(k), v);
}
});
return obj;
}
Map toJson() {
var options = new smoke.QueryOptions(includeProperties: false);
var res = smoke.query(runtimeType, options);
var map = {};
res.forEach((r) => map[smoke.symbolToName(r.name)] = smoke.read(this, r.name));
return map;
}
}
В настоящее время нет никакой поддержки, чтобы получить общую информацию о типе в дым; Однако я поднял дело об этом здесь:
https://code.google.com/p/dart/issues/detail?id=20584
Пока этот вопрос не будет реализован, «хороший» осуществление того, что вы хотите на самом деле не представляется возможным; но я надеюсь, что это будет реализовано в ближайшее время; потому что выполнение чего-то основного, как JSON-сериализация, зависит от этого!
Alan Knight также работает над пакетом Serialization, однако я обнаружил, что ему не хватает поддержки так же просто, как преобразование datetimes в строки, и решение казалось довольно многословным для чего-то такого основного.
Пока что в моем собственном проекте я пошел с кодированием нашей сериализации json (в форме методов toMap и fromMap), так как у нас уже были бы версии C# наших классов для серверной части. Если позволяет время, я бы хотел привести в порядок этот код и сделать пакет NuGet (он поддерживает вложенные объекты, массивы, исключая свойства и т. Д.).
Что вы подразумеваете под «Сериализация/десериализация JSON в дарте»? – Robert
Это зависит от ваших потребностей. –
Сериализация * * JSON проста - JSON - это текстовый формат. Я предполагаю, что вы хотите сериализацию объектов Дарта в JSON и десериализацию от JSON. Это вызывает вопрос: почему важно, чтобы формат сериализации был JSON? Dart имеет JSON-кодирование данных «JSON-like» (num, string, bool, null, List и Map), но JSON-кодирование не является сериализацией. Существуют библиотеки сериализации, но они могут иметь или не иметь основанный на JSON сериализованный формат (ну, единственная String будет JSON, но это, вероятно, не то, о чем вы думаете) –
lrn