Десериализация JSON в полиморфные типы на основе поля типа

Я использую lift-json 2.6 и Scala 2.11.

Я хочу десериализовать строку JSON, представляющую карту «датчиков» для классов case (мне вообще не нужна сериализация обратно в 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
        }
    }
}

(Реальные данные имеют гораздо больше полей, приведенные выше case-классы и JSON — это урезанная версия.)

Чтобы использовать JSON, я начинаю с:

val map = parse(jsonString).extract[Map[String,Sensor]]

Это работает, когда я, конечно, опускаю поля state.

Как можно сказать процессу извлечения, какой тип state выбрать во время выполнения, на основе значения поля sensorType? Или мне нужно написать собственный десериализатор?

Этот вопрос относится конкретно к lift-json, а не к какой-либо другой библиотеке JSON.


person caprica    schedule 09.11.2014    source источник
comment
github.com/json4s/json4s#serializing-non-supported-types   -  person jilen    schedule 09.11.2014


Ответы (1)


К сожалению, я не использовал lift-json... Но недавно я решил ту же проблему с помощью play-json. Возможно, что-то из того, что я сделал, будет полезно и вам.

См. код на моей странице github: DiscriminatedCombinators.scala

person Rushing    schedule 14.09.2015