Scala spray-json类型匹配

Scala spray-json type match

我习惯使用sacla spray-json序列化和反序列化json数据。 但是有一个问题困扰了我很久: 假设 json 数据是:

{"a":"123"}

但有时可能是:

{"a":123} or {"a":123.0}

问题是我事先不知道数据类型,可能是String或Int或Doule。

使用spray-json框架时,需要提前确定好数据格式。 下面是我的代码:

case class Input(a:Either[String,Numeric[Either[Int,Doule]]])

object SelfJsonProtocol extends DefaultJsonProtocol {
    // format the json type into scala type.
    implicit val InputFormat = jsonFormat1(Input)
}

但是编译的时候出错了。 谁能帮帮我?

实际上,如果稍微简化一下,您的案例 class 中的 Either 类型就可以工作。使用 Either[Double, String]。这样 Int 会自动解析为 Double。

示例:

import spray.json._

case class DoubleTest(a: Either[Double, String])

object MyJsonProtocol extends DefaultJsonProtocol {
  implicit val doubleTestFormat = jsonFormat1(DoubleTest)
}

import MyJsonProtocol._

val json = """[{"a":"123"}, {"a":123}, {"a":123.0}]"""
val ast = JsonParser(json)
val DTs = ast.convertTo[List[DoubleTest]]
DTs.map { dt =>
  dt.a match {
    case Left(d) => { println("double found"); d }
    case Right(d) => { println("string found"); d.toDouble }
  }
}

输出:

json: String = [{"a":"123"}, {"a":123}, {"a":123.0}]
ast: spray.json.JsValue = [{"a":"123"},{"a":123},{"a":123.0}]
DTs: List[DoubleTest] = List(DoubleTest(Right(123)), DoubleTest(Left(123.0)), DoubleTest(Left(123.0)))
string found
double found
double found
res35: List[Double] = List(123.0, 123.0, 123.0)