Map [String,Any]使用json4s压缩json字符串

时间:2015-01-08 14:52:22

标签: scala json4s

我目前正在从不同的数据源中提取一些指标,并将它们存储在Map[String,Any]类型的地图中,其中密钥对应于指标名称,而值对应于指标值。我需要这或多或少是通用的,这意味着值类型可以是基本类型或基元类型列表。

我想将此地图序列化为JSON格式的字符串,为此我使用的是json4s库。事情是它似乎不可能,我也没有看到可能的解决方案。我希望像下面这样的东西开箱即用:)

val myMap: Map[String,Any] = ...    // extract metrics
val json = myMap.reduceLeft(_ ~ _)  // create JSON of metrics

浏览source code我看到json4s提供了隐式转换,以便将原始类型转换为JValue并转换Traversable[A]/Map[String,A]/Option[A]JValue(在AJValue的隐式转换的限制下,我明白这实际上意味着A是原始类型) 。 ~运算符提供了一种很好的方法来构建JObject中的JField,这只是(String, JValue)的类型别名。< / p>

在这种情况下,地图值类型为Any,因此隐式转换不会发生,因此编译器会抛出以下错误:

                    value ~ is not a member of (String, Any)
[error]             val json = r.reduceLeft(_ ~ _)

我想要实现的目标是否有解决方案?

2 个答案:

答案 0 :(得分:32)

由于您实际上只查找myMap的JSON字符串表示形式,因此可以直接使用Serialization对象。这是一个小例子(如果使用json4s的原生版本将导入更改为org.json4s.native.Serialization):

编辑:添加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)) 

答案 1 :(得分:0)

json4s有方法。

pretty(render(yourMap))