加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

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

发布时间:2020-12-16 19:02:02 所属栏目:安全 来源:网络整理
导读:我正在从不同的数据源提取一些指标,并将它们存储在Map [String,Any]类型的映射中,其中该键对应于度量名称,该值对应于度量值.我需要这个或多或少是通用的,这意味着值类型可以是原始类型或原始类型的列表. 我想将此地图序列化为JSON格式的字符串,因此我使用的
我正在从不同的数据源提取一些指标,并将它们存储在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)的别名.

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

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

有什么想要完成的解决方案吗?

解决方法

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

编辑:添加格式隐式

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))

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读