首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Scala spray json类型匹配

Scala spray json类型匹配
EN

Stack Overflow用户
提问于 2017-06-28 18:23:08
回答 1查看 754关注 0票数 1

我习惯于使用sacla spray json来序列化和反序列化json数据。但是有一个问题困扰了我很长一段时间:假设json数据是:

代码语言:javascript
复制
{"a":"123"}

但有时可能是:

代码语言:javascript
复制
{"a":123} or {"a":123.0}

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

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

代码语言:javascript
复制
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)
}

但是在编译它的时候,这是错误的。有人能帮我吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-06-29 05:05:10

实际上,如果稍微简化一下,case类中的任一类型都可以工作。使用EitherDouble,String。这样,Int会自动解析为双精度。

示例:

代码语言:javascript
复制
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 }
  }
}

输出:

代码语言:javascript
复制
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)
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44799837

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档