我目前正在从不同的数据源中提取一些指标,并将它们存储在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
(在A
到JValue
的隐式转换的限制下,我明白这实际上意味着A
是原始类型) 。 ~
运算符提供了一种很好的方法来构建JObject
中的JField
,这只是(String, JValue)
的类型别名。< / p>
在这种情况下,地图值类型为Any
,因此隐式转换不会发生,因此编译器会抛出以下错误:
value ~ is not a member of (String, Any)
[error] val json = r.reduceLeft(_ ~ _)
我想要实现的目标是否有解决方案?
答案 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))