Как заставить Spray Json генерировать исключение, когда он видит дополнительные поля?

Например, предположим, что у меня есть

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

и json с дополнительным полем c:

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

затем я хочу найти способ (config/param/whatever), чтобы сделать следующую строку и исключение:

test.parseJson.convertTo[Test]

Очень сложно понять это, читая исходный код и документацию на github.


person samthebest    schedule 26.10.2015    source источник


Ответы (1)


Я не нашел в библиотеке ничего, что обеспечивало бы эту функциональность, поэтому я создал оболочку, которая быстро проверяет количество присутствующих полей, прежде чем делегировать вызов чтения предоставленному форматтеру.

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)

Вы можете улучшить реализацию чтения, чтобы вам не нужно было указывать аргумент «размер».

person Eric Woods    schedule 27.10.2015
comment
Хм, спасибо за ответ, не совсем то, что нам нужно, поскольку у нас могут отсутствовать некоторые поля Optional, и в итоге мы получим точно такой же размер. Тем не менее, я думаю, что мог бы отредактировать его для работы - указав ClassTag, мы можем использовать productIterator.toSet. В идеале я также хотел бы убедиться, что это также работает с stackoverflow.com/questions/33367983/ - person samthebest; 27.10.2015