我正在使用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库。
答案 0 :(得分:0)
不幸的是,我还没有使用过lift-json ......但我最近使用play-json解决了同样的问题。也许我所做的一些事情也可能对你有用。
有关代码,请参阅我的github页面:DiscriminatedCombinators.scala