現在、さまざまなデータソースからいくつかのメトリックを抽出し、タイプMap[String,Any]
のマップに保存しています。ここで、キーはメトリック名に対応し、値はメトリック値に対応します。これは多かれ少なかれ一般的である必要があります。つまり、値の型はプリミティブ型またはプリミティブ型のリストにすることができます。
このマップをJSON形式の文字列にシリアル化したいので、そのためにjson4s
ライブラリを使用しています。問題は、それが可能ではないように思われ、そのための可能な解決策が見当たらないということです。私は次のようなものが箱から出して動作することを期待します:)
val myMap: Map[String,Any] = ... // extract metrics
val json = myMap.reduceLeft(_ ~ _) // create JSON of metrics
ソースコード をナビゲートするjson4s
は、プリミティブ型をJValue
に変換し、Traversable[A]/Map[String,A]/Option[A]
をJValue
's(A
からJValue
への暗黙の変換が利用可能であるという制限の下で、これは実際にはA
がプリミティブ型であることを意味すると理解しています)。 ~
演算子は、(String, JValue)
の型エイリアスであるJObject
からJField
を構築する優れた方法を提供します。
この場合、マップ値のタイプはAny
であるため、暗黙的な変換は行われず、コンパイラーは次のエラーをスローします。
value ~ is not a member of (String, Any)
[error] val json = r.reduceLeft(_ ~ _)
私が達成したいことの解決策はありますか?
実際にはmyMap
のJSON文字列表現のみを探しているので、Serialization
オブジェクトを直接使用できます。小さな例を次に示します(ネイティブバージョンのjson4sを使用している場合は、インポートをorg.json4s.native.Serialization
に変更します)。
[〜#〜] edit [〜#〜]:追加されたformats
暗黙的
import org.json4s.jackson.Serialization
implicit val formats = org.json4s.DefaultFormats
val m: Map[String, Any] = Map(
"name "-> "joe",
"children" -> List(
Map("name" -> "Mary", "age" -> 5),
Map("name" -> "Mazy", "age" -> 3)
)
)
// prints {"name ":"joe","children":[{"name":"Mary","age":5},{"name":"Mazy","age":3}]}
println(Serialization.write(m))
json4sにはそのためのメソッドがあります。
pretty(render(yourMap))