13

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

我想将此映射序列化为 JSON 格式的字符串,为此我正在使用json4s库。问题是这似乎不可能,我看不到可能的解决方案。我希望以下内容可以开箱即用:)

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

浏览我见过的源代码json4s提供了隐式转换,以便将原始类型转换为JValue's 并转换Traversable[A]/Map[String,A]/Option[A]JValue's(在可用的隐式转换 from Ato的限制下JValue,我理解它实际上意味着A是原始类型)。该~运算符提供了一种从 ' 中构造JObject' 的好方法JField,这只是 . 的类型别名(String, JValue)

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

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

我想要完成的事情有解决方案吗?

4

2 回答 2

36

由于您实际上只是在寻找 的 JSON 字符串表示myMap,因此您可以直接使用该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)) 
于 2015-01-08T19:12:13.310 回答
-2

json4s 有它的方法。

pretty(render(yourMap))
于 2016-09-23T12:40:40.447 回答