杰克逊序列斯卡拉集

时间:2016-12-14 16:45:46

标签: json scala jackson set fasterxml

我有一个与fastxml jackson有关的问题,将scala类序列化为流派,其中一个字段为设置[类型] ,其中类型是具有单个参数

的案例类
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包含类的param名称,它应该只包含param值。它应该看起来像逗号分隔的值 [" aaaaa"," bbbb"," ccccc"] 类似

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

有没有办法,使用jackson,用一个简单的值序列化一组类,但不是param名称?

我的映射器看起来像这样

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

提前致谢!

1 个答案:

答案 0 :(得分: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"]}