Десериализация 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

Другие вопросы по тегам