2017-02-02 7 views
0

私のようなJSONオブジェクトがある場合:Json4sでは、JSONオブジェクトの整数フィールドが自動的にStringに変換されるのはなぜですか?

import org.json4s._ 
import org.json4s.jackson.JsonMethods 
import org.json4s.JsonAST.JValue 

def getVal[T: Manifest](json: JValue, fieldName: String): Option[T] = { 
    val field = json findField { 
    case JField(name, _) if name == fieldName => true 
    case _ => false 
    } 

    field.map { 
    case (_, value) => value.extract[T] 
    } 
} 

val json = JsonMethods.parse("""{"test":3}""") 
val value: Option[String] = getVal[String](json, "test") // Was Some(3) but expected None 

は、次のとおりです。

{ 
    "test": 3 
} 

は、その後、私はタイプがラインアップしていないので、文字列として「テスト」フィールドを抽出することはできないだろうと期待しますJSON数値からJson4sで期待される文字列へのこの自動変換?その場合、抽出されたフィールドがextractメソッドの型パラメーターで指定されているのと同じ型でなければならない場合の回避策がありますか?

答えて

1

これは、パーサーのすべてではないにしても、ほとんどのデフォルトの性質です。 T型の値を要求し、値がその特定の型に安全にキャストできる場合、ライブラリはそれをキャストします。たとえば、数値フィールドを文字列に変換するのと同様の性質を持つtypesafe設定を見てみましょう。

import com.typesafe.config._ 
val config = ConfigFactory parseString """{ test = 3 }""" 
val res1 = config.getString("test") 
res1: String = 3 

あなたは自動的に文字列に整数/ブールをキャストしないたかった場合は、以下に示すように、手動でのInt /ブールの種類をチェックする。このような何かを行うことができます。

if(Try(value.extract[Int]).isFailure || Try(value.extract[Boolean]).isFailure) { 
    throw RuntimeException(s"not a String field. try Int or Boolean") 
} else { 
value.extract[T] 
} 
関連する問題