Scala播放JSON类型转换

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Scala播放JSON类型转换相关的知识,希望对你有一定的参考价值。

我目前正在努力玩Play的类型转换! Scala的Json库... 我的数据看起来像这样:

val myJson = Json.parse(...)

val mapping = Map[String, Option(JsValue)](
    "id" -> (myJson  "Path"  stringValue),
    "num" -> (myJson  "Path"  intValue),
    "precision" -> (myJson  "Path"  "floatValue")
)

另外,我有一个定义每个字段的数据类型的Avro Schema,在这种情况下它是: - id:String - num:Int - 精度:漂浮

如果我现在迭代字段并像这样检查Avro Schema的类型(请注意,在这种情况下,字段是要获取的值的名称,例如“id”):

    ...
    case Schema.Type.STRING => mapping.getOrElse(field, None) match {
      case Some(stringVal: JsValue) => stringVal.as[String]
      case None => null
    }
    case Schema.Type.INT => mapping.getOrElse(field, None) match {
      case Some(intVal) => intVal.as[Int]
      case None => null
    }
    case Schema.Type.FLOAT => mapping.getOrElse(field, None) match {
      case Some(floatVal) => floatVal.as[Float]
      case None => null
    }
    ...

我总是得到这个错误:

[org.apache.kafka.streams.processor.internals.StreamThread]  - Streams application error during processing in thread [StreamThread-1]:play.api.libs.json.JsResultException: JsResultException(errors:List((,List(JsonValidationError(List(error.expected.jsnumber),WrappedArray())))))

(注意:当然error.expected.jsnumber有时也可以是jsstring)

以下是我已经尝试过的转换方法,但是没有用(我有几个不同的映射,最后仍然包含None或给定类型的值):

floatVal.as[Float]
floatVal.as[JsNumber].as[Float]
floatVal.as[JsNumber].value.toFloat
Hi,

我目前正在努力玩Play的类型转换! Scala的Json库... 我的数据看起来像这样:

val myJson = Json.parse(...)

val mapping = Map[String, Option(JsValue)](
    "id" -> (myJson  "Path"  stringValue),
    "num" -> (myJson  "Path"  intValue),
    "precision" -> (myJson  "Path"  "floatValue")
)

另外,我有一个定义每个字段的数据类型的Avro Schema,在这种情况下它是: - id:String - num:Int - 精度:漂浮

如果我现在迭代字段并像这样检查Avro Schema的类型(请注意,在这种情况下,字段是要获取的值的名称,例如“id”):

    ...
    case Schema.Type.STRING => mapping.getOrElse(field, None) match {
      case Some(stringVal: JsValue) => stringVal.as[String]
      case None => null
    }
    case Schema.Type.INT => mapping.getOrElse(field, None) match {
      case Some(intVal) => intVal.as[Int]
      case None => null
    }
    case Schema.Type.FLOAT => mapping.getOrElse(field, None) match {
      case Some(floatVal) => floatVal.as[Float]
      case None => null
    }
    ...

我总是得到这个错误:

[org.apache.kafka.streams.processor.internals.StreamThread]  - Streams application error during processing in thread [StreamThread-1]:play.api.libs.json.JsResultException: JsResultException(errors:List((,List(JsonValidationError(List(error.expected.jsnumber),WrappedArray())))))

(注意:当然error.expected.jsnumber有时也可以是jsstring)

以下是我已经尝试过的转换方法,但是没有用(我有几个不同的映射,最后仍然包含None或给定类型的值):

floatVal.as[Float]
floatVal.as[JsNumber].as[Float]
floatVal.as[JsNumber].value.toFloat
floatVal.as[String].value.toFloat
floatVal.as[JsString].value.toString.toFloat
floatVal.as[String].toFloat
floatVal.as[String].value.toFloat
floatVal.as[JsString].value.toString.toFloat
floatVal.as[JsString].as[String].toFloat
floatVal.as[JsString].as[String].value.toFloat
floatVal.as[JsString].as[String].value.toString.toFloat

不知怎的,我有所有类型的问题,只在某些情况下,但我有他们... 同样有趣的是,即使类型是JsValue,当我使用调试器查看它们时,类型说Js<type>,例如JsString而不是JsValue。 在某些情况下,但并非总是如此,它还为Int类型显示JsString ...

为什么不把它们当作JsValue

转换Play的正确方法是什么! Json类型?

谢谢所有最好的蒂姆

答案

只是确保以对我有用的方式更新。

在我的情况下,我只是自己做了JsStringJsNumber,...转换,以便框架不会自己推断它的类型。

以上是关于Scala播放JSON类型转换的主要内容,如果未能解决你的问题,请参考以下文章

linux打开终端如何启动scala,如何在终端下运行Scala代码片段?

播放Framework和Scala Json,解析包含JSArray和JSObject的json

如何在 Spark 2 Scala 中将 Row 转换为 json

在代码片段中包含类型转换

Scala 中的显式类型转换

在 slick、scala 中处理 Postgres json 数据类型