基于类型字段将JSON反序列化为多态类型

时间:2014-11-09 11:13:16

标签: scala lift-json

我正在使用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库。

1 个答案:

答案 0 :(得分:0)

不幸的是,我还没有使用过lift-json ......但我最近使用play-json解决了同样的问题。也许我所做的一些事情也可能对你有用。

有关代码,请参阅我的github页面:DiscriminatedCombinators.scala