【问题标题】:Jackson Serialise a Scala SetJackson 序列化一个 Scala 集
【发布时间】:2026-01-23 07:45:01
【问题描述】:

我有一个与 fastxml jackson 相关的问题,它在序列化 scala 类 Genre 时将 Set 作为字段之一 Set[Type] where Type 是具有单个参数 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 包含类的参数名称,它应该只包含参数值。它应该看起来像一个逗号分隔的值 ["aaaaa","bbbb","ccccc"] 类似

{"genre":{"name":"xxxxxx","types":["aaaaa","bbbb","ccccc"]}}

有没有什么方法可以使用jackson序列化一组类,其中包含简单的值但没有参数名称?

我的映射器是这样的

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

提前致谢!

【问题讨论】:

    标签: json scala jackson set fasterxml


    【解决方案1】:

    它应该看起来像一个逗号分隔值 ["aaaaa","bbbb","ccccc"]

    那是Set[String],但你拥有的是Set[Type]。杰克逊正在做它应该做的事情。您需要将您的班级签名更改为:

    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"]}
    

    【讨论】:

    • 正确,但我不能在那里使用 String,因为我想限制用户为该字段传递垃圾值,所以我想通过在那里强加一个字段类型来限制它们
    • 嗯,您的问题中没有任何内容暗示您不希望它是 Set[String]。如果您想限制可以分配给字段的数据类型,则应首先针对该类型验证数据序列化之前。这就是拥有 type 的全部意义——你不能分配随机值。这里有两个完全不同的问题——验证和序列化。您的问题看起来像是 XY 问题 - 询问您尝试的解决方案,而不是您的实际问题。