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)
我习惯使用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)