如何将Scala Map转换为JSON字符串?

lyr7nygr  于 2023-08-05  发布在  Scala
关注(0)|答案(8)|浏览(170)

例如,我在Scala中有这个Map值:

val m = Map(
    "name" -> "john doe", 
    "age" -> 18, 
    "hasChild" -> true, 
    "childs" -> List(
        Map("name" -> "dorothy", "age" -> 5, "hasChild" -> false),
        Map("name" -> "bill", "age" -> 8, "hasChild" -> false)
    )
)

字符串
我想把它转换成JSON字符串表示:

{
    "name": "john doe",
    "age": 18,
    "hasChild": true,
    "childs": [
        {
            "name": "dorothy",
            "age": 5,
            "hasChild": false
        },
        {
            "name": "bill",
            "age": 8,
            "hasChild": false
        }
    ]
}


我目前正在开发Play框架v2.3,但解决方案不需要使用Play JSON库,尽管如果有人能提供Play和非Play解决方案就好了。
这是我迄今为止所做的,没有成功:

// using jackson library
val mapper = new ObjectMapper()
val res = mapper.writeValueAsString(m)
println(res)


测试结果:

{"empty":false,"traversableAgain":true}


我不明白为什么我得到了这个结果。

w6lpcovy

w6lpcovy1#

作为一个非播放解决方案,你可以考虑使用json4s,它提供了一个围绕Jackson的 Package 器,并且易于使用。如果你使用的是json 4s,那么你可以使用以下命令将map转换为json:

write(m)                                        
//> res0: String = {"name":"john doe","age":18,"hasChild":true,"childs":[{"name":"dorothy","age":5,"hasChild":false},{"name":"bill","age":8,"hasChild":false}]}

字符串
--更新以包含完整示例--

import org.json4s._
import org.json4s.native.Serialization._
import org.json4s.native.Serialization
implicit val formats = Serialization.formats(NoTypeHints)

 val m = Map(
  "name" -> "john doe",
  "age" -> 18,
  "hasChild" -> true,
  "childs" -> List(
    Map("name" -> "dorothy", "age" -> 5, "hasChild" -> false),
    Map("name" -> "bill", "age" -> 8, "hasChild" -> false)))

 write(m)


输出量:

res0: String = {"name":"john doe","age":18,"hasChild":true,"childs":[{"name" 
 :"dorothy","age":5,"hasChild":false},{"name":"bill","age":8,"hasChild":false }]}


替代方式:

import org.json4s.native.Json
import org.json4s.DefaultFormats

Json(DefaultFormats).write(m)

rhfm7lfc

rhfm7lfc2#

val mapper = new ObjectMapper()
mapper.writeValueAsString(Map("a" -> 1))

字符串
结果> {"empty":false,"traversableAgain":true}

import com.fasterxml.jackson.module.scala.DefaultScalaModule

val mapper = new ObjectMapper()
mapper.registerModule(DefaultScalaModule)
mapper.writeValueAsString(Map("a" -> 1))


结果> {"a":1}

gudnpqoy

gudnpqoy3#

你需要告诉Jackson如何处理Scala对象:第一个月

zpf6vheq

zpf6vheq4#

val mymap = array.map {
  case 1 => ("A", 1)
  case 2 => ("B", 2)
  case 3 => ("C", 3)
}
  .toMap

字符串
使用scala.util.parsing.json.JSONObject只需要一行

import scala.util.parsing.json.JSONObject

JSONObject(mymap).toString()

3xiyfsfu

3xiyfsfu5#

如果您正在使用定义良好的数据模型,为什么不定义case类并使用PlayJSON宏来处理转换呢?即

case class Person(name: String, age: Int, hasChild: Boolean, childs: List[Person])

implicit val fmt = Json.format[Person]

val person = Person(...)

val jsonStr = Json.toJson(person)

字符串

toiithl6

toiithl66#

使用Jackson库可以做的一件事是使用java HashMap对象,而不是Scala对象。然后,您基本上可以使用您已经编写的相同的“不成功”代码。

import org.codehaus.jackson.map.ObjectMapper
val mapper = new ObjectMapper()
val jmap = new java.util.HashMap[String, Int]()
jmap.put("dog", 4)
jmap.put("cat", 1)
// convert to json formatted string
val jstring  = mapper.writeValueAsString(jmap)
println(jstring)

字符串
退货

jstring: String = {"dog":4,"cat":1}

8fsztsew

8fsztsew7#

如果有人正在寻找使用标准库的解决方案。

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
}

字符串

8iwquhpp

8iwquhpp8#

下面的代码片段摘自scala官方网站,对我来说效果很好。它使用uPickle库。

val map: Map[String, Int] =
  Map("Toolkitty" -> 3, "Scaniel" -> 5)
val jsonString: String = upickle.default.write(map)
println(jsonString)
// prints: {"Toolkitty":3,"Scaniel":5}

字符串
https://docs.scala-lang.org/toolkit/json-serialize.html

相关问题