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

nul*_*ull 15 json scala playframework playframework-2.0

例如,我在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)
    )
)
Run Code Online (Sandbox Code Playgroud)

我想将其转换为其JSON字符串表示形式:

{
    "name": "john doe",
    "age": 18,
    "hasChild": true,
    "childs": [
        {
            "name": "dorothy",
            "age": 5,
            "hasChild": false
        },
        {
            "name": "bill",
            "age": 8,
            "hasChild": false
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)

我目前正在使用Play framework v2.3,但该解决方案不需要使用Play JSON库,但如果有人可以同时提供Play和非Play解决方案,那将会很好.

这是我到目前为止没有成功的事情:

// using jackson library
val mapper = new ObjectMapper()
val res = mapper.writeValueAsString(m)
println(res)
Run Code Online (Sandbox Code Playgroud)

结果:

{"empty":false,"traversableAgain":true}
Run Code Online (Sandbox Code Playgroud)

我不明白为什么我得到那个结果.

moh*_*hit 22

作为一种非游戏解决方案,您可以考虑使用json4s,它提供了一个围绕jackson的包装器,并且易于使用.如果您使用的是json4s,那么只需使用以下命令即可将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}]}
Run Code Online (Sandbox Code Playgroud)

- 更新以包含完整示例 -

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)
Run Code Online (Sandbox Code Playgroud)

输出:

 res0: String = {"name":"john doe","age":18,"hasChild":true,"childs":[{"name" 
 :"dorothy","age":5,"hasChild":false},{"name":"bill","age":8,"hasChild":false }]}
Run Code Online (Sandbox Code Playgroud)

替代方式:

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

Json(DefaultFormats).write(m)
Run Code Online (Sandbox Code Playgroud)


Dim*_*ima 8

你需要告诉jackson如何处理scala对象: mapper.registerModule(DefaultScalaModule)


小智 5

val mapper = new ObjectMapper()
mapper.writeValueAsString(Map("a" -> 1))
Run Code Online (Sandbox Code Playgroud)

结果> {“空”:false,“ traversableAgain”:true}

=============================

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

val mapper = new ObjectMapper()
mapper.registerModule(DefaultScalaModule)
mapper.writeValueAsString(Map("a" -> 1))
Run Code Online (Sandbox Code Playgroud)

结果> {“ a”:1}

  • 虽然此代码可以回答问题,但提供有关如何和/或为何解决问题的附加上下文将提高​​答案的长期价值。 (2认同)

Tyl*_*归玉门 5

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

使用scala.util.parsing.json.JSONObject您只需要 1 行

import scala.util.parsing.json.JSONObject

JSONObject(mymap).toString()
Run Code Online (Sandbox Code Playgroud)

  • 请注意,它不会递归,并且会将嵌套对象转换为其字符串表示形式! (2认同)
  • 此外,它已被弃用(使用 Scala 2.11.12)。我现在没有做一些需要我担心的事情,但我想我应该提一下。 (2认同)