diff --git a/play-json/shared/src/main/scala/play/api/libs/json/JavaEnumFormat.scala b/play-json/shared/src/main/scala/play/api/libs/json/JavaEnumFormat.scala new file mode 100644 index 000000000..17e55db09 --- /dev/null +++ b/play-json/shared/src/main/scala/play/api/libs/json/JavaEnumFormat.scala @@ -0,0 +1,36 @@ +/* + * Copyright (C) 2009-2018 Lightbend Inc. + */ + +package play.api.libs.json + +/** + * Helper for format a java enum into or from json + * + * public enum TestEnum { + * + * TEST1, + * TEST2, + * OKAY + * + * } + * + * implicit val TestEnumFormat = JavaEnumFormat.format[TestEnum] + * + */ +object JavaEnumFormat { + def format[A <: Enum[A]](implicit m: scala.reflect.Manifest[A]): Format[A] = { + new JsonJavaEnumFormat[A] + } +} + +/** + * Format for java enums from and to json + * + * @tparam A the type of the enum + */ +class JsonJavaEnumFormat[A <: Enum[A]](implicit m: scala.reflect.Manifest[A]) extends Format[A] { + def reads(json: JsValue) = JsSuccess(Enum.valueOf[A](m.runtimeClass.asInstanceOf[Class[A]], json.as[String])) + + def writes(enumValue: A) = JsString(enumValue.name()) +} diff --git a/play-json/shared/src/test/scala/play/api/libs/json/JavaTestEnum.java b/play-json/shared/src/test/scala/play/api/libs/json/JavaTestEnum.java new file mode 100644 index 000000000..78850e666 --- /dev/null +++ b/play-json/shared/src/test/scala/play/api/libs/json/JavaTestEnum.java @@ -0,0 +1,19 @@ +/* + * Copyright (C) 2009-2018 Lightbend Inc. + */ + +package play.api.libs.json; + + +public enum JavaTestEnum { + + TEST_1(true), + + TEST_2(false); + + public final boolean testPriv; + + JavaTestEnum(boolean testPriv) { + this.testPriv = testPriv; + } +} diff --git a/play-json/shared/src/test/scala/play/api/libs/json/JavaTestsEnumsFormat.scala b/play-json/shared/src/test/scala/play/api/libs/json/JavaTestsEnumsFormat.scala new file mode 100644 index 000000000..9e24bf266 --- /dev/null +++ b/play-json/shared/src/test/scala/play/api/libs/json/JavaTestsEnumsFormat.scala @@ -0,0 +1,10 @@ +/* + * Copyright (C) 2009-2018 Lightbend Inc. + */ + +package play.api.libs.json + +object JavaTestsEnumsFormat { + implicit val testsEnumsFormat = JavaEnumFormat.format[JavaTestEnum] +} + diff --git a/play-json/shared/src/test/scala/play/api/libs/json/ReadsSharedSpec.scala b/play-json/shared/src/test/scala/play/api/libs/json/ReadsSharedSpec.scala index 2ddc3097a..a3c8d22ea 100644 --- a/play-json/shared/src/test/scala/play/api/libs/json/ReadsSharedSpec.scala +++ b/play-json/shared/src/test/scala/play/api/libs/json/ReadsSharedSpec.scala @@ -158,6 +158,14 @@ class ReadsSharedSpec extends WordSpec with MustMatchers { } } + "JavaEnumFormat" should { + import JavaTestsEnumsFormat._ + "deserialize correctly java enum with names" in { + JsString("TEST_1").validate[JavaTestEnum] mustEqual JsSuccess(JavaTestEnum.TEST_1) + JsString("TEST_2").validate[JavaTestEnum] mustEqual JsSuccess(JavaTestEnum.TEST_2) + } + } + // --- case class Owner( diff --git a/play-json/shared/src/test/scala/play/api/libs/json/WritesSharedSpec.scala b/play-json/shared/src/test/scala/play/api/libs/json/WritesSharedSpec.scala index 69b7a76e5..ef28845f1 100644 --- a/play-json/shared/src/test/scala/play/api/libs/json/WritesSharedSpec.scala +++ b/play-json/shared/src/test/scala/play/api/libs/json/WritesSharedSpec.scala @@ -76,6 +76,14 @@ class WritesSharedSpec extends WordSpec with MustMatchers { } } + "JavaEnumFormat" should { + import JavaTestsEnumsFormat._ + "serialize correctly java enum with names" in { + Json.toJson(JavaTestEnum.TEST_1) mustEqual JsString("TEST_1") + Json.toJson(JavaTestEnum.TEST_2) mustEqual JsString("TEST_2") + } + } + // --- case class Location(lat: Double, long: Double)