代码之家  ›  专栏  ›  技术社区  ›  Yang

Scala spray json类型匹配

  •  1
  • Yang  · 技术社区  · 7 年前

    我习惯于使用sacla spray json序列化和反序列化json数据。 但有一个问题长期困扰着我: 假设json数据为:

    {"a":"123"}
    

    但有时可能是:

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

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

    以下是我的代码:

    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)
    }
    

    但编译它时,这是错误的。

    1 回复  |  直到 7 年前
        1
  •  3
  •   jsdeveloper    7 年前

    实际上,只要稍微简化一点,case类中的任何一种类型都可以工作。使用[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)