2

私はjsonを解析しています。その値を他の型に変換したいと思います。すなわち

//json = JSON String 
val seq = net.liftweb.json.parse(json).\\("seq").values.toString.toLong
val userName = net.liftweb.json.parse(json).\\("name").values.toString
val intNum = net.liftweb.json.parse(json).\\("intId").values.toInt

ジェネリック メソッドを使用してより「scala」な方法でキャストしたいのですが、次のようなことを試しました。

object Converter{
  def JSONCaster[T](json:String,s:String):T={
    net.liftweb.json.parse(json).\\(s).values.toString.asInstanceOf[T]
  }
}

しかし、キャストエラーが発生しました:

java.lang.ClassCastException: java.lang.String は scala.runtime.BoxesRunTime.unboxToLong で java.lang.Long にキャストできません (不明なソース)

4

4 に答える 4

1

スプレーで実装されているマーシャリング/アンマーシャリングを見てください。ソリューションを再発明する必要はないかもしれません。そうする場合は、そのソースを見て、彼らがそれをどのように実装したかを確認できます。

スプレーのマーシャリング/アンマーシャリングは、オブジェクト グラフのシリアライゼーションに似ており、JSON 以外にも機能するため、実装には固有の複雑さが追加されています。

JSON を手動で解析して、 lift-jsonを試すこともできます。

lift-json は JSON に近いですがextract、Spray のマーシャラー/アンマーシャラーと同様に動作します。

于 2013-07-18T12:37:06.513 に答える
0

ここでは、liftweb / lift-json を操作する汎用メソッドを scala で作成しています。アイデアとして、暗黙的なマニフェストを提供する必要があります。

import net.liftweb

private def jsonToObjectsSeq[T](jsonAsString: String)(implicit man: Manifest[T]): Seq[T] = {
  parse(jsonAsString)
    .children
    .map(_.extract[T])
}
于 2020-12-09T16:11:53.303 に答える