Scala - Circe - Сериализация класса Case без имени класса - PullRequest
0 голосов
/ 01 октября 2018

Я ранее использовал Circe для сериализации / десериализации класса дел, и мне нравится, как его можно использовать без стандартного кода, требуемого другими библиотеками Scala JSON, но сейчас я сталкиваюсь с проблемой:Я не уверен, как решить.У меня есть ADT (запечатанная черта с несколькими экземплярами класса дел), которую я хотел бы обработать (из моей службы Akka Http, используя akka-http-json ) в общем (т.е. вернуть List[Foo],где Foo - это тип черты), но когда я делаю это, используя авто-деривацию Цирцеи (через Shapeless), он сериализует экземпляры, используя имя класса конкретного случая в качестве «дискриминатора» (например, если мой List[Foo] содержитэкземпляры Foo1, тогда каждый элемент в результирующем сериализованном списке будет иметь ключ Foo1).Я хотел бы исключить имя типа как дискриминатор (т. Е. Чтобы вместо каждого элемента в последовательности с префиксом имени типа - например, "Foo1": {"id : "1", name : "First",...}, я просто хотел сериализовать экземпляры класса case, чтобы они содержали полякласса case: например, {"id":"1,"name:"First",...} ... По сути, я хотел бы исключить ключи имени типа (я не хочу, чтобы передний конец знал, какому классу case принадлежит каждый элемент на оборотной стороне-конец).Все элементы в списке, подлежащие сериализации, будут иметь один и тот же конкретный тип, и все они будут подтипами моего типа ADT (черты).Я считаю, что это можно сделать с помощью полуавтоматического деривации Цирцеи, хотя у меня не было возможности выяснить, как именно.По сути, я хотел бы использовать как можно больше авто-деривации Circe, но исключить появление имен классов внешнего уровня в результирующем JSON.Любая помощь / предложения будут очень признательны!Спасибо!

1 Ответ

0 голосов
/ 02 октября 2018

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

implicit val genDevConfig: Configuration.default.withDescriminator("type")

(здесь вы можете использовать любое имя поля, которое вам нравится; предыдущее Travis Brown пример для аналогичной проблемы использовалось поле с именем what_am_i).Так что мои извинения - я пока не знаю, есть ли каноническое или общепринятое решение этой проблемы, особенно такое, которое будет легко работать с Akka Http, используя такие библиотеки, как akka-http-json , гдеКажется, я все еще сталкиваюсь с некоторыми проблемами, хотя я уверен, что, возможно, пропускаю что-то очевидное!В любом случае, я прошу прощения за то, что задал вопрос, который, кажется, возникает неоднократно!

...