Я использую 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.