diff --git a/zio-json/shared/src/main/scala-3/zio/json/macros.scala b/zio-json/shared/src/main/scala-3/zio/json/macros.scala index 1c9c91a16..05098ca73 100644 --- a/zio-json/shared/src/main/scala-3/zio/json/macros.scala +++ b/zio-json/shared/src/main/scala-3/zio/json/macros.scala @@ -397,7 +397,10 @@ object DeriveJsonDecoder extends Derivation[JsonDecoder] { self => lazy val namesMap: Map[String, Int] = names.zipWithIndex.toMap - def isEnumeration = ctx.subtypes.forall(_.typeclass.isInstanceOf[CaseObjectDecoder[?, ?]]) + def isEnumeration = + (ctx.isEnum && ctx.subtypes.forall(_.typeclass.isInstanceOf[CaseObjectDecoder[?, ?]])) || ( + !ctx.isEnum && ctx.subtypes.forall(_.isObject) + ) def discrim = ctx.annotations.collectFirst { case jsonDiscriminator(n) => n } @@ -632,7 +635,10 @@ object DeriveJsonEncoder extends Derivation[JsonEncoder] { self => } def split[A](ctx: SealedTrait[JsonEncoder, A]): JsonEncoder[A] = { - val isEnumeration = ctx.subtypes.forall(_.typeclass == caseObjectEncoder) + val isEnumeration = + (ctx.isEnum && ctx.subtypes.forall(_.typeclass == caseObjectEncoder)) || ( + !ctx.isEnum && ctx.subtypes.forall(_.isObject) + ) val jsonHintFormat: JsonMemberFormat = ctx.annotations.collectFirst { case jsonHintNames(format) => format }.getOrElse(IdentityFormat)