首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Scala播放JSON类型转换

Scala播放JSON类型转换
EN

Stack Overflow用户
提问于 2017-12-21 21:43:52
回答 1查看 1.4K关注 0票数 0

我目前正在为剧中的类型转换而奋斗!斯卡拉的Json图书馆..。

我有这样的数据:

代码语言:javascript
复制
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
  • 精度:浮子

如果我现在迭代这些字段,并按照这样的Avro模式检查类型(请注意,在本例中,该字段是要获取的值的名称,例如"id"):

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

我总是会犯这样的错误:

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

下面是我已经尝试过但没有工作的转换方法(我有几种不同的映射,最终仍然包含给定类型的任何或一个值):

代码语言:javascript
复制
floatVal.as[Float]
floatVal.as[JsNumber].as[Float]
floatVal.as[JsNumber].value.toFloat
Hi,

我目前正在为剧中的类型转换而奋斗!斯卡拉的Json图书馆..。

我有这样的数据:

代码语言:javascript
复制
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
  • 精度:浮子

如果我现在迭代这些字段,并按照这样的Avro模式检查类型(请注意,在本例中,该字段是要获取的值的名称,例如"id"):

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

我总是会犯这样的错误:

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

下面是我已经尝试过但没有工作的转换方法(我有几种不同的映射,这些映射最终仍然包含给定类型的任何或一个值):

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

什么是正确的方式来改变这出戏!Json类型?

谢谢你,提姆

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-12-26 16:26:19

只是要确保更新一下我的工作方式。

在我的例子中,我刚刚做了JsStringJsNumber,.立即进行转换,这样框架就不会自己推断出它的类型。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47933115

复制
相关文章

相似问题

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