使用json4s映射[String,Any]以压缩json字符串

jar*_*daf 12 scala json4s

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

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

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

通过导航源代码我已经看到json4s为了变换原始类型来提供隐式转换JValue的和也将转换Traversable[A]/Map[String,A]/Option[A]JValue的(被购自的隐式转换的限制下AJValue,这是我明白它实际上意味着A是一个基本类型).该~运营商提供构建的一个很好的方式JObject的出来JField的,这仅仅是一个类型别名(String, JValue).

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

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

我想要完成的是什么解决方案?

edi*_*edi 33

由于您实际上只是在查找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)) 
Run Code Online (Sandbox Code Playgroud)

  • 仅供进一步参考,需要隐式的"Formats"实例,否则会出现以下错误:"找不到org.json4s.Formats.尝试在范围内引入org.json4s.Formats的实例或使用org.json4s.DefaultFormats.例如,`implicit val formats = org.json4s.DefaultFormats`解决了这个问题. (3认同)