使用 json4s 将 [String,Any] 映射到压缩 json 字符串
Map[String,Any] to compact json string using 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
's(在可用的限制下,从 A
到 JValue
的隐式转换,我理解它实际上意味着 A
是原始类型)。 ~
运算符提供了一种从 JField
构造 JObject
的好方法,它只是 (String, JValue)
.
的类型别名
在这种情况下,映射值类型是 Any
,因此不会发生隐式转换,因此编译器会抛出以下错误:
value ~ is not a member of (String, Any)
[error] val json = r.reduceLeft(_ ~ _)
对于我想要完成的事情有解决方案吗?
由于你实际上只是在寻找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))
json4s 有方法。
pretty(render(yourMap))
我目前正在从不同的数据源中提取一些指标并将它们存储在 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
's(在可用的限制下,从 A
到 JValue
的隐式转换,我理解它实际上意味着 A
是原始类型)。 ~
运算符提供了一种从 JField
构造 JObject
的好方法,它只是 (String, JValue)
.
在这种情况下,映射值类型是 Any
,因此不会发生隐式转换,因此编译器会抛出以下错误:
value ~ is not a member of (String, Any)
[error] val json = r.reduceLeft(_ ~ _)
对于我想要完成的事情有解决方案吗?
由于你实际上只是在寻找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))
json4s 有方法。
pretty(render(yourMap))