当看到额外的字段时,如何使Spray Json抛出异常?

时间:2015-10-26 18:02:20

标签: json scala spray spray-json

例如假设我有

case class Test(a: String, b: String)
...
implicit val testFormat = jsonFormat2(Test.apply)

和一个带有额外c字段的json:

val test = "{\"a\": \"A\", \"b\": \"B\", \"c\": \"C\"}"

然后我想找到一种方法(config / param / whatever)来进行以下行抛出和异常:

test.parseJson.convertTo[Test]

通过阅读源代码和github文档来解决这个问题非常困难。

1 个答案:

答案 0 :(得分:0)

我没有在库中看到提供该功能的任何内容,因此我创建了一个包装器,在将读取调用委托给提供的格式化程序之前快速检查存在的字段数。

case class StrictRootFormat[T](format: RootJsonFormat[T], size: Int) extends RootJsonFormat[T] {

  def read(json: JsValue): T = {
    if(json.asJsObject.fields.size > size) deserializationError("JSON has too many fields: \n " + json.toString())
    else format.read(json)
  }

  def write(obj: T): JsValue = format.write(obj)

}

用法:

implicit val testFormat = StrictRootFormat(jsonFormat2(Test.apply), 2)

您可以增强读取实现,这样就不需要提供“size”参数。