Десериализация JSON в полиморфные типы на основе поля типа
Я использую Лифт-JSON 2.6 и Scala 2.11.
Я хочу десериализовать строку JSON, представляющую карту "датчиков" для классов дел (мне все равно, когда сериализация возвращается в JSON):
case class TemperatureSensor(
name: String, sensorType: String, state: TemperatureState)
case class TemperatureState(
on: Boolean, temperature: Float)
case class LightSensor(
name: String, sensorType: String, state: LightState)
case class LightState(
on: Boolean, daylight: Boolean)
У меня есть некоторые общие поля в каждом классе датчиков, в зависимости от типа state
поле, различаемое sensorType
имущество
Идея в том, что я вызываю веб-сервис и получаю обратно карту сенсорной информации, это может быть любое количество разных типов сенсоров. Я заранее знаю множество возможных типов, но заранее не знаю, какие именно датчики будут возвращены.
JSON выглядит так:
{
"1":
{
name: "Temp1",
sensorType: "Temperature",
state:
{
on: true,
temperature: 19.4
}
},
"2":
{
name: "Day",
sensorType: "Daylight",
state:
{
on: true,
daylight: false
}
}
}
(В реальных данных есть еще много полей, приведенные выше классы падежей, а JSON является урезанной версией.)
Чтобы использовать JSON, я начинаю с:
val map = parse(jsonString).extract[Map[String,Sensor]]
Это работает, когда я опускаю state
поля конечно.
Как можно узнать процесс извлечения, какой тип state
выбрать во время выполнения, основываясь на значении sensorType
поле? Или я должен написать собственный десериализатор?
Этот вопрос относится конкретно к lift-json, а не к любой другой библиотеке JSON.
1 ответ
К сожалению, я не использовал lift-json... Но недавно я решил ту же проблему с помощью play-json. Возможно, кое-что из того, что я сделал, могло бы быть полезным и для вас.
Смотрите мою страницу на github для кода: DiscriminationCombinators.scala