Jackson 序列化 Scala 集
Jackson Serialise a Scala Set
我有一个与 fasterxml jackson 相关的问题,用于序列化一个 scala class Genre 并将 Set 作为字段之一 Set[Type] 其中 Type 是一个案例 class 具有单个参数 value
class Type(val value: String) extends AnyVal
case class Genre(name: String, types: Set[Type])
当我尝试序列化它时,它给出类似
的内容
{"genre":{"name":"xxxxxx","types":[{"value":"aaaaa"}, {"value":"bbbb"}, {"value":"ccccc"}]}}
但我不希望生成的 json 包含 class 的参数名称,它应该只包含参数值。它应该看起来像逗号分隔值 ["aaaaa","bbbb","ccccc"] 之类的
{"genre":{"name":"xxxxxx","types":["aaaaa","bbbb","ccccc"]}}
有什么方法可以使用 jackson 序列化一组 classes,其中只有值而不是参数名称?
我的映射器看起来像这样
private val mapper = new ObjectMapper
mapper.registerModule(DefaultScalaModule)
提前致谢!
It should simply look like a comma separated values ["aaaaa","bbbb","ccccc"]
那是Set[String]
,但是你有的是Set[Type]
。杰克逊正在做它应该做的事情。您需要将 class 签名更改为:
case class Genre(name: String, types: Set[String])
import com.fasterxml.jackson.databind.ObjectMapper
import com.fasterxml.jackson.module.scala.DefaultScalaModule
object TestObject {
def main(args: Array[String]): Unit = {
val mapper = new ObjectMapper()
mapper.registerModule(DefaultScalaModule)
val genre = Genre("xxxxxx", Set(new Type("aaaaa"), new Type("bbbb"), new Type("ccccc")))
println("Genre: " + mapper.writeValueAsString(genre))
val anotherGenre = AnotherGenre("xxxxxx", Set("aaaaa", "bbbb", "ccccc"))
println("AnotherGenre: " + mapper.writeValueAsString(anotherGenre))
}
}
class Type(val value: String) extends AnyVal
case class Genre(name: String, types: Set[Type])
case class AnotherGenre(name: String, types: Set[String])
输出:
Genre: {"name":"xxxxxx","types":[{"value":"aaaaa"},{"value":"bbbb"},{"value":"ccccc"}]}
AnotherGenre: {"name":"xxxxxx","types":["aaaaa","bbbb","ccccc"]}
我有一个与 fasterxml jackson 相关的问题,用于序列化一个 scala class Genre 并将 Set 作为字段之一 Set[Type] 其中 Type 是一个案例 class 具有单个参数 value
class Type(val value: String) extends AnyVal
case class Genre(name: String, types: Set[Type])
当我尝试序列化它时,它给出类似
的内容{"genre":{"name":"xxxxxx","types":[{"value":"aaaaa"}, {"value":"bbbb"}, {"value":"ccccc"}]}}
但我不希望生成的 json 包含 class 的参数名称,它应该只包含参数值。它应该看起来像逗号分隔值 ["aaaaa","bbbb","ccccc"] 之类的
{"genre":{"name":"xxxxxx","types":["aaaaa","bbbb","ccccc"]}}
有什么方法可以使用 jackson 序列化一组 classes,其中只有值而不是参数名称?
我的映射器看起来像这样
private val mapper = new ObjectMapper
mapper.registerModule(DefaultScalaModule)
提前致谢!
It should simply look like a comma separated values ["aaaaa","bbbb","ccccc"]
那是Set[String]
,但是你有的是Set[Type]
。杰克逊正在做它应该做的事情。您需要将 class 签名更改为:
case class Genre(name: String, types: Set[String])
import com.fasterxml.jackson.databind.ObjectMapper
import com.fasterxml.jackson.module.scala.DefaultScalaModule
object TestObject {
def main(args: Array[String]): Unit = {
val mapper = new ObjectMapper()
mapper.registerModule(DefaultScalaModule)
val genre = Genre("xxxxxx", Set(new Type("aaaaa"), new Type("bbbb"), new Type("ccccc")))
println("Genre: " + mapper.writeValueAsString(genre))
val anotherGenre = AnotherGenre("xxxxxx", Set("aaaaa", "bbbb", "ccccc"))
println("AnotherGenre: " + mapper.writeValueAsString(anotherGenre))
}
}
class Type(val value: String) extends AnyVal
case class Genre(name: String, types: Set[Type])
case class AnotherGenre(name: String, types: Set[String])
输出:
Genre: {"name":"xxxxxx","types":[{"value":"aaaaa"},{"value":"bbbb"},{"value":"ccccc"}]}
AnotherGenre: {"name":"xxxxxx","types":["aaaaa","bbbb","ccccc"]}