gpt4 book ai didi

scala - 将 Scala 案例类转换为 JSON

转载 作者:行者123 更新时间:2023-12-05 08:42:07 29 4
gpt4 key购买 nike

我有两个案例类。主要的 Request 包含两个 map 。第一个映射有一个用于键和值的字符串。第二个映射有一个字符串键和一个值,它是第二个案例类 KVMapList 的一个实例。

case class Request (var parameters:MutableMap[String, String] = MutableMap[String, String](), var deps:MutableMap[String, KVMapList] = MutableMap[String, KVMapList]())

case class KVMapList(kvMap:MutableMap[String, String], list:ListBuffer[MutableMap[String, String]])

要求是将Request 转换为JSON 表示形式。以下代码试图做到这一点:

import com.fasterxml.jackson.annotation.PropertyAccessor
import com.fasterxml.jackson.module.scala.experimental.ScalaObjectMapper
import com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility
import com.fasterxml.jackson.databind.ObjectMapper

def test(req:Request):String {
val mapper = new ObjectMapper() with ScalaObjectMapper
mapper.setVisibility(PropertyAccessor.ALL, Visibility.ANY)
var jsonInString: String = null
try {
jsonInString = mapper.writeValueAsString(request)
}
catch {
=case e: IOException => {
e.printStackTrace
}
jsonString
}

然而,这是行不通的。即使填充了 Request 类,输出也是:

{"parameters":{"underlying":{"some-value":""},"empty":false,"traversableAgain":true},"deps":{"sizeMapDefined":false,"empty":false,"traversableAgain":true}}

将 JSON 对象映射器与相应的 Java 类一起使用很简单,但尚未在 Scala 中使用它。非常感谢任何帮助。

最佳答案

Jackson 在某种程度上更像是 Scala 中的一个糟糕的旧内存。您应该使用 native Scala 库进行 JSON 处理,尤其是真正擅长 JSON 序列化程序的编译时推导的库,例如 circe .

我知道这并不能直接回答您的问题,但在使用 circe 之后我再也不会回到其他任何地方了。

import io.circe.generic.auto._
import io.circe.parser._
import io.circe.syntax._

val req = new Request(...)
val json = req.asJson.noSpaces
val reparsed = decode[Request](json)

换句话说,在案例类中使用可变映射是非常不合惯用的,使用自动生成的 copy 方法为您的映射实现不可变操作应该是非常简单的.

case class Request(parameters: Map[String, String] {
def +(key: String, value: String): Request = {
this.copy(parameters = parameters + (key -> value))
}
}

你真的应该尽可能避免可变性,看起来在这里避免它根本不会有太大的工作。

关于scala - 将 Scala 案例类转换为 JSON,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44590613/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com