Спрей JSON не может сериализовать класс case - PullRequest
0 голосов
/ 08 мая 2018

Я пытаюсь преобразовать следующий класс дел в / из JSON с помощью Spray:

case class Interval(lower: Int, upper: Int)

Это достигается с помощью:

implicit val intervalFormat = jsonFormat2(Interval)

Компилируется, но выдает ошибку времени выполнения:

Невозможно автоматически определить имена полей класса дел и порядок для интервала, используйте перегрузку jsonFormat с явной спецификацией имени поля

Поиск по этой ошибке показывает, что она обычно возникает, когда подклассы объявляют дополнительные поля, а здесь это не так.

Я ошибаюсь, полагая, что Spray должен иметь возможность автоматически форматировать интервальный класс?

Если это так, то (как следует из сообщения об ошибке) я должен предоставить средство форматирования с более явной информацией о полях интервала? Как это может быть легко достигнуто?

РЕДАКТИРОВАТЬ : Ответ @retrospectacus предлагает несколько полезных моментов, но ни один из них не решает проблему. Обходное решение, которое я принял, состояло в том, чтобы предоставить явное описание типов и имен полей:

implicit val intervalFormat = jsonFormat[Int, Int,Interval](Interval, "lower", "upper")

Это работает, но я оставляю вопрос открытым, так как до сих пор не ясно, зачем это нужно.

1 Ответ

0 голосов
/ 09 мая 2018

Распространенные причины этой ошибки:

  • Если у вас где-то есть case object Interval (компаньон), тогда jsonFormat должен быть создан как jsonFormat2(Interval.apply).
  • Добавление аннотации типа к формату может помочь: implicit val intervalFormat: RootJsonFormat[Interval] = ...
  • Ваш класс Interval может быть перепутан с другим классом Interval, возможно org.joda.time.Interval, либо при создании jsonFormat, либо в месте создания или сериализации класса case - вы можете добавить префикс или исправить импорт, чтобы избежать этого .

Надеюсь, это поможет.

EDIT : Еще одна причина этой проблемы, с которой я только что столкнулся, заключается в том, что если у вас есть val, объявленный в классе case, сериализатор не сможет автоматически сгенерировать формат. Э.Г.

case class Interval(from: Int, to: Int) {
  val size: Int = to - from
}

Ошибка будет «java.lang.RuntimeException: Case Class Interval объявляет дополнительные поля».

Эту проблему можно решить с помощью перегрузки jsonFormat, как описано выше, или val можно просто изменить на def.

...