我正在使用 lift-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
这个想法是我调用 Web 服务并获取传感器信息的地图,这可以是任意数量的任何类型的不同传感器。我事先知道可能的类型集,但我事先不知道将返回哪些特定传感器。
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 库。