【问题标题】:scala/liftweb serializing jsonscala/liftweb 序列化 json
【发布时间】:2015-04-18 07:58:14
【问题描述】:

我正在为 scala 使用 net.liftweb 解析器

我有一个这样的json

  {
  "k1":"v1",
  "k2":["v21", "v22", "v23"]
  }

k2 是一个可选字段,json 可能有也可能没有。我把它提取到一个案例类中

案例类 MyCC (k1: String, k2: List[String])

当 json 转换为 case 类时,如果 k2 不存在,则将其反序列化为空列表。问题是在转换回 json 时,如果它是一个空列表,我怎么能让解析器不序列化这个字段。

【问题讨论】:

  • 这听起来正是Option 的意思。
  • @soong:你的意思是字段 k2 应该是类型:Option[List[String]]。我不认为使用 2 个 continers (list , option) 是个好主意
  • 为什么不呢?这正是它的本质......我想如果你不喜欢它,你可以只使用一个空列表,但你编写的以这种方式处理它的逻辑正是Option 已经包含的内容。
  • 我更喜欢Nil: List[String] 而不是None: Option[List[String]]。额外的布局对我来说很烦人。而且在处理 api 需求、elasticSearch 索引等时,无论如何都必须熟悉这些序列化策略。

标签: scala lift


【解决方案1】:

您应该创建custom serializer。这应该适合您的情况:

import org.json4s._
import org.json4s.native.Serialization.write
class NilSerializer extends CustomSerializer[List[String]](format => ( {
    case JNothing => Nil
  }, {
    case Nil => JNothing
}))

implicit val formats = DefaultFormats + new NilSerializer
println(write(MyCC("key", Nil)))
>> {"k1":"key"}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-17
    • 2015-02-28
    • 2013-04-04
    • 1970-01-01
    • 2014-07-02
    相关资源
    最近更新 更多