当 json 字段可选时使用 SprayJson

Using SprayJson when json fields are optional

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

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

字段 a、b、c 和 h 是必需的,但其他字段不是。我的案例 class 有一个自定义 JSON 格式化程序。由于各种原因,我需要构建案例 class 的方式要求我执行自定义 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")
}

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

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

 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)

我不熟悉 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)