0

我目前正在为 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 模式,它定义了每个字段的数据类型,在这种情况下它是:
- id:String
- num:Int -precision
:Float

如果我现在遍历字段并像这样检查 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 模式,它定义了每个字段的数据类型,在这种情况下它是:
- id:String
- num:Int -precision
:Float

如果我现在遍历字段并像这样检查 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.
在某些情况下,但并非总是如此,它也显示JsString为 Int 类型...

为什么不让它们保持原样JsValue

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

谢谢所有最好的蒂姆

4

1 回答 1

0

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

就我而言,我只是自己立即进行了JsString, JsNumber, ... 转换,这样框架就不会自行推断它的类型。

于 2017-12-26T16:26:19.687 回答