首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >不带参数名称的JSON4S反序列化

不带参数名称的JSON4S反序列化
EN

Stack Overflow用户
提问于 2017-02-14 03:36:24
回答 1查看 270关注 0票数 0

我有以下用例:

我使用JSON4S编写的每个类都有一个名为ID的字段。此ID可以是任何类型的T <: Stringifiable,其中Stringifiable要求将您的ID类型散列为一个字符串。Stringifiable还具有从字符串重新构建它们的构造函数。

我想插入任何Stringifiable,例如ComplexIdentifierID: stringified_identifier的JSON。序列化工作得很好,但不幸的是,在反序列化期间,JSON4S不会使用默认构造函数,因为它只有一个字符串构造函数。它会找到构造函数,但如果标识符的签名为case class ComplexIdentifier(whatever: String),它会尝试从JString(stringified_identifier)中提取whatever名称。这样做失败了,所以在内部抛出了MappingException

有没有办法教JSON4S在不像这样提取值的情况下使用默认构造函数?很明显,只使用JString中的值并使用该值构造Stringifiable

谢谢!

EN

回答 1

Stack Overflow用户

发布于 2017-02-14 22:33:56

使用Companion中的apply方法,用字符串参数重载ID类的构造函数。然后,只需对所有ID类型使用自定义序列化程序

代码语言:javascript
运行
复制
sealed abstract class Stringifiable {}

case class ComplexIdentifier(whatever: List[Long]) extends Stringifiable
case class SimpleIdentifier(whatever: Int) extends Stringifiable

//Overload the default constructor
object ComplexIdentifier {
  def apply(s: String):ComplexIdentifier = {
    ComplexIdentifier(s.split(",").map(_.toLong).toList)
  }
}

case class MyClass(id: ComplexIdentifier, value: String)

然后使用定制的序列化程序:

代码语言:javascript
运行
复制
case object ComplexIdentifierSerializer extends CustomSerializer[ComplexIdentifier] ( formats =>
({
    case JString(id) => ComplexIdentifier(id)
    case JNull => null
 },
 {
   case x: ComplexIdentifier => JString(x.whatever.mkString(","))
 }))

最后,确保在隐式格式中包含序列化程序:

代码语言:javascript
运行
复制
implicit val formats = DefaultFormats ++ List(ComplexIdentifierSerializer)

println(parse("""
   {
    "id": "1",
    "value": "big value"
    }
    """).extract[MyClass])

  val c = MyClass(ComplexIdentifier("123,456"), "super value")
  println(write(c))
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42212150

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档