0

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

4

1 回答 1

0

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

有关代码,请参见我的 github 页面:DiscriminateCombinators.scala

于 2015-09-14T14:31:06.547 回答