如何在 Scala 中将映射、序列和基本类型的任何嵌套组合转换为 JSON?

亚历克斯·霍尔

在 Python 中,我可以任意嵌套列表和字典并使用混合类型,然后简单地调用json.dumps(x)并获得我需要的结果。

我在 Scala 中找不到这样的东西。我遇到的所有库似乎都坚持静态类型和编译时检查。为了简单起见,我宁愿放弃它。似乎应该可以动态检查输入的类型。

作为一个简单的例子,我希望能够执行以下操作:

toJson(Map("count" -> 1,
           "objects" -> Seq(Map("bool_val" -> true,
                                "string_val" -> "hello"))))

这将输出一个包含以下内容的字符串:

{"count": 1, "objects": [{"bool_val": true, "string_val": "hello"}]}

编辑:这是我尝试几个库时发生的情况:

scala> import upickle.default._
import upickle.default._

scala> write(Seq(1, 2))
res0: String = [1,2]

scala> write(Seq(1, "2"))
<console>:15: error: Couldn't derive type Seq[Any]
       write(Seq(1, "2"))
            ^

scala> import spray.json._
import spray.json._

scala> import spray.json.DefaultJsonProtocol._
import spray.json.DefaultJsonProtocol._

scala> Seq(1, 2).toJson
res2: spray.json.JsValue = [1,2]

scala> Seq(1, "2").toJson
<console>:21: error: Cannot find JsonWriter or JsonFormat type class for Seq[Any]
       Seq(1, "2").toJson
                   ^

我尝试为喷雾创建自己的通用协议,但得到了奇怪的结果:

import spray.json._

object MyJsonProtocol extends DefaultJsonProtocol {

  implicit object AnyJsonWriter extends JsonFormat[Any] {
    def write(x: Any) = x match {
      case n: Int => JsNumber(n)
      case n: Long => JsNumber(n)
      case d: Double => JsNumber(d)
      case s: String => JsString(s)
      case b: Boolean if b => JsTrue
      case b: Boolean if !b => JsFalse
      case m: Map[Any, Any] => m.toJson
      case p: Product => p.productIterator.toList.toJson  // for tuples
      case s: Seq[Any] => s.toJson
      case a: Array[Any] => a.toJson
    }

    override def read(json: JsValue) = ???
  }

}

import MyJsonProtocol._

val objects = Seq(Map(
  "bool_val" -> true,
  "string_val" -> "hello"))

objects.toJson.toString
// [{"bool_val":true,"string_val":"hello"}]

Map(
  "count" -> 1,
  "objects" -> objects).toJson.toString
// {"count":1,"objects":[{"bool_val":true,"string_val":"hello"},[]]}
//                          I don't know where this comes from: ^
亚历克斯·霍尔

基于https://coderwall.com/p/o--apg/easy-json-un-marshalling-in-scala-with-jackson

import com.fasterxml.jackson.databind.ObjectMapper
import com.fasterxml.jackson.module.scala.DefaultScalaModule
import com.fasterxml.jackson.module.scala.experimental.ScalaObjectMapper

val mapper = new ObjectMapper() with ScalaObjectMapper
mapper.registerModule(DefaultScalaModule)

def toJson(value: Any): String = {
  mapper.writeValueAsString(value)
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在Scala中将类型为Map [String,Map [String,Any]]的嵌套映射转换为JSON?

如何在scala中将列表转换为Json数组

如何在Scala中将JSON文件的记录转换为列表

如何在Spark 2 Scala中将Row转换为json

如何在Scala中将任何对象作为Json Writeable传递?

如何在scala中将hashMap转换成json对象?

在Scala(Play Framework)中将对象序列化为JSON基本类型

如何在Play Scala中正确验证和转换JSON?

如何在Play Framework 2.3.x(Scala)中将案例类转换为JSON?

如何在Scala.js中将Map转换为Json对象?

如何在Scala的Json Parser中将String更改为Int

如何在Scala中更新嵌套的JSON数组

如何在Spark Scala中读取多行嵌套json

如何将嵌套的 JSON 转换为 Scala 中的映射对象

如何在Scala上解析Json

如何在scala中遍历json数组

如何在Scala中创建JSON对象?

如何在Scala中解析JSON数据?

我如何将具有混合类型值的json通过scala和json spray转换为json

如何在jq中将嵌套的json转换为平面csv

如何在python pandas中将csv转换为嵌套的json?

如何在nodejs中将嵌套的JSON转换为excel

如何在python中将值转换为嵌套的JSON?

如何在 Python 中将 CSV 转换为嵌套的 JSON

如何在Scala中组合fastutil映射?

在Scala Spark中将嵌套的JSON转换为数据帧

如何在Python中将Json对象转换为树类型?

如何在NodeJS和ExpressJS中将嵌套的JSON对象数组转换为CSV

如何在 Pandas 中将嵌套的 JSON 对象转换为行和列