Как сериализовать / десериализовать класс case в js.Dynamic с помощью uPickle
Я использую uPickle/ScalaJS для десериализации объекта js.Dynamic в класс case с использованием этого фрагмента кода:
read[myClass](JSON.stringify(dynObj))
где myClass - это класс case, а dynObj - это объект js.Dynamic.
Есть ли простой и простой способ сделать это?
Для того, чтобы сериализовать класс case, я смог сериализовать в js.Dynamic, используя Shapeless, используя этот пример в качестве отправной точки:
Преобразование вложенных классов дел во вложенные Карты с помощью Shapeless
Я хотел бы иметь возможность использовать uPickle, чтобы сделать это вместо этого. Как я могу совершить поездку в оба конца с помощью uPickle?
2 ответа
upickle.default.readJs[myClass](upickle.json.readJs(dynObj))
Должен сделать это. Вы можете обернуть это хорошим помощником, если вы обнаружите, что делаете это много.
Подобные звонки существуют, чтобы писать вещи js.Dynamic
, наоборот
upickle.json.writeJs(upickle.default.writeJs[myClass](myClassInstance))
Хотя вы, возможно, можете опустить параметр типа здесь, так как он будет выведен
Ответ выше больше не относится к более новым версиям upickle
, В версии 0.6.5
Мне пришлось использовать следующее для десериализации динамического объекта:
val someJsObject: js.Dynamic = ...
upickle.WebJson.transform(someJsObject, implicitly[upickle.default.Reader[TargetType]])
Для сериализации вы, вероятно, захотите что-то вроде:
val sourceObject: SourceType = ...
implicitly[upickle.default.Writer[SourceType]].write(upickle.WebJson.Builder, sourceObject)