gpt4 book ai didi

json - 如何使用 Jackson 将 Scala 值类序列化为字符串?

转载 作者:行者123 更新时间:2023-12-04 17:43:54 26 4
gpt4 key购买 nike

我想使用 Scala 的值类(或普通案例类)为我程序中的某些字符串提供更强的类型。当我使用 Jackson 序列化这些类的实例时,我希望它们是字符串。

例如:

case class Brand(name: String) extends AnyVal
val brands = Seq(Brand("Coke"), Brand("Disney"))
val brandCount = Map(Brand("Coke") -> 5, Brand("Disney") -> 10)

由于 Brand 只是字符串的包装器,我希望这些变量的相应 JSON 序列化为:

brands:     ["Coke", "Disney"]
brandCount: {"Coke": 5, "Disney": 10}

默认我得到:

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

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

println(mapper.writeValueAsString(brands))
// ==> [{"name":"Coke"},{"name":"Disney"}]
println(mapper.writeValueAsString(brandCount))
// ==> {"Brand(Coke)":5,"Brand(Disney)":10}

我能想到的最好办法是为 Brand 定义自定义序列化程序和 key 序列化程序:

import com.fasterxml.jackson.databind.module.SimpleModule
import com.fasterxml.jackson.databind.JsonSerializer
import com.fasterxml.jackson.databind.SerializerProvider
import com.fasterxml.jackson.core.JsonGenerator

class BrandSerializer extends JsonSerializer[Brand] {
override def serialize(
b: Brand,
json: JsonGenerator,
provider: SerializerProvider
): Unit = {
json.writeString(b.name)
}
}

class BrandKeySerializer extends JsonSerializer[Brand] {
override def serialize(
b: Brand,
json: JsonGenerator,
provider: SerializerProvider
): Unit = {
json.writeFieldName(b.name)
}
}

val serializers = new SimpleModule("Serializers");
serializers.addSerializer(classOf[Brand], new BrandSerializer())
serializers.addKeySerializer(classOf[Brand], new BrandKeySerializer());

val mapper = new ObjectMapper()
mapper.registerModule(DefaultScalaModule)
mapper.registerModule(serializers)

println(mapper.writeValueAsString(brands))
// ==> ["Coke","Disney"]
println(mapper.writeValueAsString(brandCount))
// ==> {"Coke":5,"Disney":10}

是否有更好(或更简洁)的方法将这些值类(或任何 case 类)序列化为字符串?

最佳答案

好吧,我不认为,有一种方法可以让它做所有你想做的事,而且没有你不想要的......您想到的最好的办法是将 Brand 替换为 Product1,并将 b.name 替换为 b._1(我还认为,您的 key 序列化程序是错误的 - 它应该写出 b.getClass.getSimpleName,而不是 b.name)。

这不会使写出单个类变得不那么冗长,但至少会消除为类似的每种类型创建单独的序列化程序的需要。

当然,缺点是每个 one-field case class 最终都会以这种方式编写,这可能比您希望的要多..

关于json - 如何使用 Jackson 将 Scala 值类序列化为字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43898457/

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