Как сериализовать / десериализовать класс 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)
Другие вопросы по тегам