在 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] 删除。
我来说两句