2017-12-21 24 views
0

私は現在、Play!のタイプ変換に苦労しています。Scala Play JSONタイプ変換

また
val myJson = Json.parse(...) 

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

、私はこのケースでは、それはだ、各フィールドのデータ型を定義アブロスキーマを持っています:
- IDを次のようになりScalaのためのJSONライブラリ...
私はデータを持っています:文字列
- NUM:のInt
- 精度:フロート

私は今、フィールドを反復処理し、この場合には、そのフィールドを(このようなアブロスキーマに対してタイプをチェックします取得する値の名前である場合には、例:「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することができます)。ここ

は、私はすでに試した変換の方法がありますそして、(私は最終的にはまだなしまたは指定された型の値のいずれかを含まないマッピングのいくつかの異なるを持って)動作しませんでした:

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

私は、CuよPlayのタイプ変換に激しく苦しんでいます!

また
val myJson = Json.parse(...) 

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

、私はこのケースでは、それはだ、各フィールドのデータ型を定義アブロスキーマを持っています:
- IDを次のようになりScalaのためのJSONライブラリ...
私はデータを持っています:文字列
- NUM:のInt
- 精度:フロート

私は今、フィールドを反復処理し、この場合には、そのフィールドを(このようなアブロスキーマに対してタイプをチェックします取得する値の名前である場合には、例:「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することができます)。ここ

は、私はすでに試した変換の方法があります

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> 、例えばJsValueの代わりにJsStringです。いくつかの場面で
は、しかし常に、それはまた、int型のためJsStringを表示...

なぜそれがJsValueとしてそれらを保持しませんか?

Playを変換する正しい方法は何ですか。 Jsonタイプ?

は ティム

+1

最小の再生装置に焦点を当ててください。そこに問題がかなり広がっています – cchantep

+0

@cchantep私は質問をさらに指定しなければならないヒントを教えてもらえますか?一般的には、プレーフレームワークが 'Int'値を暗黙的に 'JsString'値に変換して実際の' Int'値に変換したいときにエラーをスローするときに、変換をどのように処理するのかという疑問があります –

答えて

0

はちょうど私のために働いた方法で更新することを確認してすべてのベスト、ありがとうございました。

私の場合は、フレームワークがそれ自身の型を推論しないように、私自身がただちにJsStringJsNumber、...変換を自分で実行しました。