我使用的是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
字段时,这是有效的。
如何根据sensorType
字段的值告诉提取过程在运行时选择哪种类型的state
?还是我必须写一个自定义的取消序列化程序?
这个问题特别涉及lift-json,而不是任何其他的json库。
很遗憾,我没有使用lift-json。。。但我最近使用play-json解决了同样的问题。也许我所做的一些事情对你也有用。
请参阅我的github页面以获取代码:DiscriminatedCombinators.scala