基于类型字段将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字段时,这是有效的。

如何根据sensorType字段的值告诉提取过程在运行时选择哪种类型的state?还是我必须写一个自定义的取消序列化程序?

这个问题特别涉及lift-json,而不是任何其他的json库。

很遗憾,我没有使用lift-json。。。但我最近使用play-json解决了同样的问题。也许我所做的一些事情对你也有用。

请参阅我的github页面以获取代码:DiscriminatedCombinators.scala

相关内容

  • 没有找到相关文章

最新更新