Как написать Codec Scala Argonaut для всех Java Enums -- scala поле с участием argonaut пол Связанный проблема

How to write a Scala Argonaut codec for all Java enums


5
vote

проблема

русский

У меня есть Scala Project, который использует кучу Java-кода, например, этот Java источник:

 <код> public enum Category { FOO, BAR };   

У меня есть куча классов Scala Case, которые я сериал и от JSON, используя аргонавт, как это:

 <код> case class Thing (a: String, b: Int, c: Float) object Thing {   implicit val j = casecodec3 (Thing.apply, Thing.unapply)("a", "b", "c")   implicit val e: Equal[Guild] = Equal.equal (_ == _) }   

Хорошо, теперь я хочу написать класс Case Case, который использует java enum, как:

 <код> case class Thing (a: String, b: Int, c: Float, d: Category) object Thing {   implicit val j = casecodec4 (Thing.apply, Thing.unapply)("a", "b", "c", "d")   implicit val e: Equal[Guild] = Equal.equal (_ == _) }   

Это даст ошибку компиляции, потому что нет неявной кодеки для категории Enum.

Я думаю, я мог бы написать свой собственный кодек специально для того, чтобы иметь дело с категорией Enum, делая что-то подобное:

 <код> package object ArgonautImplicits {   implicit val dx: DecodeJson[Category] = StringDecodeJson.map(x => Category.valueOf(x))   implicit val ex: EncodeJson[Category] = EncodeJson(x => jString(x.toString)) }   

Но я хочу знать, есть ли способ написать один кодек, который автоматически обрабатывает любой java enum.

Английский оригинал

I have a Scala project that uses a bunch of Java code, for example this Java source:

public enum Category { FOO, BAR }; 

I then have a bunch of Scala case classes that I serialise to and from JSON using Argonaut like this:

case class Thing (a: String, b: Int, c: Float) object Thing {   implicit val j = casecodec3 (Thing.apply, Thing.unapply)("a", "b", "c")   implicit val e: Equal[Guild] = Equal.equal (_ == _) } 

Fine, now I want to write a Scala case class that uses a Java enum like so:

case class Thing (a: String, b: Int, c: Float, d: Category) object Thing {   implicit val j = casecodec4 (Thing.apply, Thing.unapply)("a", "b", "c", "d")   implicit val e: Equal[Guild] = Equal.equal (_ == _) } 

This will yield a compilation error because there is no implicit codec for the Category enum.

I guess I could write my own codec specifically for dealing with the Category enum by doing something like this:

package object ArgonautImplicits {   implicit val dx: DecodeJson[Category] = StringDecodeJson.map(x => Category.valueOf(x))   implicit val ex: EncodeJson[Category] = EncodeJson(x => jString(x.toString)) } 

But I want to know if there is a way to write a single codec that will automatically handle any Java enum.

</div
     

Список ответов

Связанный проблема

1  В Scala, какой правильный способ сортировки списка на композитный ключ  ( In scala what is the right way to sort a list on a composite key ) 
Я пытаюсь получить лучшие элементы N-1 из списка. Я прошел через подобные посты в так, как здесь . Я понял мотивы за решениями, предложенными на этих постах....

110  Скала актеры: прием против реагирования  ( Scala actors receive vs react ) 
Позвольте мне сначала сказать, что у меня довольно много явского опыта, но только недавно заинтересовались функциональными языками. Недавно я начал смотреть н...

1  Извлечь данные из Mongodblist  ( Extract data from mongodblist ) 
Как я могу получить <код> List(String) из этого <код> MongoDBList ? <код> val a: MongoDBList = ... // equal to [ { "id" : "0001"} , { "id" : "0017"}] Ж...

16  Ошибка теста SBT: Java.lang.noSuchmethodError: net.jpountz.lz4.lz4lockinputtream  ( Sbt test error java lang nosuchmethoderror net jpountz lz4 lz4blockinputstream ) 
Получение ниже исключения, когда я пытался выполнить тесты подразделения для моего светового потокового кода на SBT Windows, используя STALATEST. sbt teston...

0  Невозможно вызвать функцию через объект компаньона  ( Unable to call function via companion object ) 
Почему введенном ниже примере, я могу не звонить x.callme (). Мое понимание заключается в том, что присвоение «var x = тест» вернет новый экземпляр тестирован...

2  Искра оболочки ошибка: ERROR SparkDeploySchedulerBackend: В ответ на просьбу удалить несуществующую исполнителя 11  ( Spark shell error error sparkdeployschedulerbackend asked to remove non exist ) 
<Р> Всякий раз, когда я начинаю искровой скорлупу на mapr Песочница я продолжаю получать эту ошибку <код> ERROR SparkDeploySchedulerBackend: Asked to remove ...

-1  Лучший способ проектирования и параллелизма зажигания в Scala [закрыто]  ( Best way to design and parallelize a spark application in scala ) 
<в сторону CLASS = "S-NEWACTS S-WELTIVE__info JS-Post-New Imide MB16« Роль = «Статус»> закрыт . Этот вопрос находится на основе мнения . В настоящее вре...

0  Разница между def m (p: t forsome {type t} и def m1 (p: eld), есть какие-нибудь? Пояснение необходимо на основе спецификации языка Scala  ( Difference between def mp t forsome type t and def m1pany is there any ) 
<код> object ExistentialTypesAsFunctionParameters extends App{ def m(p: T forSome {type T})=p.toString def m1(p:Any)=p.toString println(m("...

0  Переполнение стека при компиляции Scala Code в Maven из-за дублирующих имен  ( Stack overflow when compiling scala code in maven due to duplicate names ) 
Мне нужно внести некоторые изменения в класс в моем пакете, но я не хотел потерять начальный класс. Я копирую класс и вставьте его в тот же проект и изменяет ...

-1  Как использовать SBT, чтобы создать проект плагина IDEA?  ( How to use sbt to create an idea plugin project ) 
Мы можем легко использовать Intellij-идею, чтобы легко импортировать нормальный проект SBT, но я пытаюсь написать проект плагина IDEW со SCALA, и я хочу испол...

0  Есть ли путь к Abstrat передает значения?  ( Is there any way to abstrat enums valueset ) 
Я использую Scala 2.11, у меня есть следующие enums: <код> object Gender extends Enumeration { val male = Value("Male") val female = Value("Female") } ...

19  Другие языки программирования, которые поддерживают непливные «A La Scala»  ( Other programming languages that support implicits a la scala ) 
Scala Thrine - очень мощные. Мне любопытно, если они являются новой / уникальной особенностью Scala, или концепция уже существовала на других языках программи...

1  SBT броски AssertionError в компиляции с неразъемным сообщением об ошибке  ( Sbt throws assertionerror at compilation with indecipherable error message ) 
Я получаю эти странные сообщения об ошибках при попытке перекомпилировать мой проект SBT, после добавления небольших изменений в код. Иногда, в зависимости от...

14  Что означает «стр»% «ул» в SBT?  ( What does str str mean in sbt ) 
Я наткнулся на этот код: <код> import sbt._ class AProject(info: ProjectInfo) extends DefaultProject(info) { val scalaToolsSnapshots = ScalaToolsSnapsh...

2  Scala.js: выбор и манипулирующий сгенерированный SVG  ( Scala js selecting and manipulating generated svg ) 
Я борюсь с чем-то, казалось бы, простым. Использование SCAJA.JS, я создал несколько SVG с библиотекой STALATAGS. Теперь я хочу манипулировать элементами S...

Связанный проблема

1  В Scala, какой правильный способ сортировки списка на композитный ключ 
110  Скала актеры: прием против реагирования 
1  Извлечь данные из Mongodblist 
16  Ошибка теста SBT: Java.lang.noSuchmethodError: net.jpountz.lz4.lz4lockinputtream 
0  Невозможно вызвать функцию через объект компаньона 
2  Искра оболочки ошибка: ERROR SparkDeploySchedulerBackend: В ответ на просьбу удалить несуществующую исполнителя 11 
-1  Лучший способ проектирования и параллелизма зажигания в Scala [закрыто] 
0  Разница между def m (p: t forsome {type t} и def m1 (p: eld), есть какие-нибудь? Пояснение необходимо на основе спецификации языка Scala 
0  Переполнение стека при компиляции Scala Code в Maven из-за дублирующих имен 
-1  Как использовать SBT, чтобы создать проект плагина IDEA? 
0  Есть ли путь к Abstrat передает значения? 
19  Другие языки программирования, которые поддерживают непливные «A La Scala» 
1  SBT броски AssertionError в компиляции с неразъемным сообщением об ошибке 
14  Что означает «стр»% «ул» в SBT? 
2  Scala.js: выбор и манипулирующий сгенерированный SVG