当json字段是可选的时使用SprayJson

时间:2015-04-14 16:38:53

标签: scala spray-json

我正在编写一个Scala restful API并使用SprayJson来解析在Post调用期间传入的JSON。例如,我们有一个如下所示的JSON结构:

{"a", "b", "c", "d", "e", "f", "g", "h"}

字段a,b,c和h是必需的,但其他字段不是。我的case类有一个自定义的JSON格式化程序。由于各种原因,我需要构建案例类的方式需要我做自定义JSON格式化程序。

以下是格式化程序中读取函数的代码片段:

def read(value: JsValue) = {
    value.asJsObject.getFields("a", "b", "c", "d", "e", "f", "g", "h")
    case Seq(JsString(a),JsString(b),JsString(c),JsString(d),JsString(e),JsString(f),JsString(g),JsString(h))
    new Object(a,b,c,d,e,f,g,h)
    case _ => throw new DeserializationException("Object expected")
}

如何在没有大量案例字符串匹配可能出现的每个字段排列的情况下实现上述内容?

2 个答案:

答案 0 :(得分:0)

无需编写自己的格式化程序,对可选字段使用选项

 case class Data(a: String, b: String, c: String, d: Option[String], e:
 Option[String], f: Option[String], g: Option[String], h: String)

   jsonFormat8(Data)

答案 1 :(得分:0)

我不熟悉spray-json,但如果不存在字段被视为某种JNull,那么你可以试试这个:

implicit def JsValueToString(v: JsValue): String = v match {
  case JsString(s) => s
  case _ => null
}
...
case Seq(JsString(a),JsString(b),JsString(c), dOpt, eOpt,fOpt,gOpt,JsString(h)) =>
    new Object(a,b,c,dOpt,eOpt,fOpt,gOpt,h)