将Map转换为Json String格式

时间:2016-10-19 09:41:39

标签: scala

我正在尝试将任何包含Any的Map [String,Any]转换为Map [String,Any]等等,转换为Json String格式。

我找到了这个外部库http://json4s.org/,但令我惊讶的是,Scala核心不包含用于实现此目的的本机库。

有什么想法吗?

问候。

3 个答案:

答案 0 :(得分:1)

JSON是一种交换格式(虽然目前很受欢迎),但XML等等也是如此。核心库可能不应该关注处理一长串数据格式 - 至少这是什么我理解在Scala核心中限制此类支持的原因与其他语言一样。

有很多库可以帮助您实现这一目标。

我目前使用Argonaut来表示Scala项目中的所有JSON,除非我使用Play,在这种情况下它还提供了非常好的JSON支持。看看Argonaut,你可以很容易地实现你想要的东西。

答案 1 :(得分:1)

据我所知,我认为您正在使用Json的自定义实现:Map[String, Any]

所以这里是函数的自定义实现,它将返回地图的String

def show(json: Map[String, Any]) : String = {

  def parse(elem: (String, Any)): String = elem match {
    case (a: String, b: Map[String, _]) => "\"" + a + "\"" + ":" + show(b) + ""
    case (a: String, b: Boolean) => "\"" + a + "\"" + ":" + b.toString
    case (a: String, b: Int) => "\"" + a + "\"" + ":" + b.toString
    case (a: String, b: Double) => "\"" + a + "\"" + ":" + b.toString
    case (a: String, b: String) => "\"" + a + "\"" + ":\"" + b + "\""
  }

  val assocs = json.map {
    case(key, value) => parse((key,value))
  }

  "{\n" + assocs.mkString(", \n")+ "}"

}

这样的地图:

val mapJson = Map("root" ->
  Map("field1" -> 1,
      "field2" -> Map("field1" -> true,
      "field2" -> 2.03),
      "field3" -> "Test"))

它会打印出来:

String = {
"root":{
"field1":1, 
"field2":{
"field1":true, 
"field2":2.03}, 
"field3":"Test"}}

答案 2 :(得分:0)

Scala没有内置功能,但是它具有惊人的sintax ...在这里,共有8条惯用语:

def toJson(query: Any): String = query match {
   case m: Map[String, Any] => s"{${m.map(toJson(_)).mkString(",")}}"
   case t: (String, Any) => s""""${t._1}":${toJson(t._2)}"""
   case ss: Seq[Any] => s"""[${ss.map(toJson(_)).mkString(",")}]"""
   case s: String => s""""$s""""
   case null => "null"
   case _ => query.toString
}