web-dev-qa-db-ja.com

Map [String、Any]をjson4sを使用してjson文字列を圧縮する

現在、さまざまなデータソースからいくつかのメトリックを抽出し、タイプ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(_ ~ _)

私が達成したいことの解決策はありますか?

12
jarandaf

実際には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)) 
32
edi

json4sにはそのためのメソッドがあります。

pretty(render(yourMap))
0