zio / zio-json

Fast, secure JSON library with tight ZIO integration.
https://zio.dev/zio-json
Apache License 2.0
407 stars 146 forks source link

Unable to locate the JsonDecoder for a type constructor containing a nested type. #1128

Closed wi101 closed 1 month ago

wi101 commented 3 months ago

Hello,

This issue appeared when updating to zio-json: 0.7.0. Here is an example:


final case class Id[A](value: A)
object Id {
  implicit def decoder[A: JsonDecoder]: JsonDecoder[Id[A]] = DeriveJsonDecoder.gen[Id[A]]
}

final case class Person(name: String) extends AnyVal
object Person {
  implicit val decoder: JsonDecoder[Person] = DeriveJsonDecoder.gen
}

final case class People(ids: Id[Person])
object People {
  implicit val decoder: JsonDecoder[People] = DeriveJsonDecoder.gen
}

Error:

magnolia: could not find JsonDecoder.Typeclass for type Id[Person]
[error]     in parameter 'ids' of product type People
[error]   implicit val decoder: JsonDecoder[People] = DeriveJsonDecoder.gen

People.decoder cannot find the decoder for Id[Person]. There is an issue on finding the Id.decoder ..

when we manually add the decoder to Id companion object:

object Id {
    implicit val decoderIds: JsonDecoder[Id[Person]] = DeriveJsonDecoder.gen
}

The same error appears. But it works only when we add that decoder to People companion.

object People {
  implicit val decoderIds: JsonDecoder[Id[Person]] = Id.decoder
  implicit val decoder: JsonDecoder[People] = DeriveJsonDecoder.gen
}
jdegoes commented 3 months ago

/bounty $200

algora-pbc[bot] commented 3 months ago

## 💎 $200 bounty • ZIO

### Steps to solve: 1. Start working: Comment /attempt #1128 with your implementation plan 2. Submit work: Create a pull request including /claim #1128 in the PR body to claim the bounty 3. Receive payment: 100% of the bounty is received 2-5 days post-reward. Make sure you are eligible for payouts

Thank you for contributing to zio/zio-json!

Add a bountyShare on socials

Attempt Started (GMT+0) Solution
🔴 @Anshgrover23 Jun 28, 2024, 4:11:00 PM WIP
🔴 @omarnagy91 Jul 9, 2024, 4:58:42 AM WIP
🟢 @ifndev Jul 29, 2024, 1:45:06 PM #1139
Anshgrover23 commented 3 months ago

/attempt #1128

987Nabil commented 2 months ago

@wi101 I am unable to reproduce What Scala version are you using? Are the definitions all in the same file? Are you sure you have no conflicting versions in your project?

omarnagy91 commented 2 months ago

/attempt #1128

wi101 commented 2 months ago

@987Nabil

This is the full example (the same file)

import zio.json.{DeriveJsonDecoder, JsonDecoder}

final case class Id[A](value: A)
object Id {
  implicit def decoder[A: JsonDecoder]: JsonDecoder[Id[A]] = DeriveJsonDecoder.gen[Id[A]]
}

final case class Person(name: String) extends AnyVal
object Person {
  implicit val decoder: JsonDecoder[Person] = DeriveJsonDecoder.gen
}

final case class People(ids: Id[Person])
object People {
  implicit val decoder: JsonDecoder[People] = DeriveJsonDecoder.gen
}

scalaVersion: 2.13.14 zioJsonVersion: 0.7.0

ifndev commented 2 months ago

Hi, this issue seems stale so I gave it a shot.

What I found out:

  • PR #1115 introduced "codec derivation for types that already have encoder and decoder"
  • Faced with an error in one of the tests (same test case as this issue) with scala 2.12, it was decided to remove the feature for this specific version.
  • Turns out it doesn't work on 2.13 either

What I did:

/attempt #1128

Algora profile Completed bounties Tech Active attempts Options
@ifndev 1 bounty from 1 project
Python, C++,
TypeScript & more
Cancel attempt
algora-pbc[bot] commented 2 months ago

💡 @ifndev submitted a pull request that claims the bounty. You can visit your bounty board to reward.

ifndev commented 2 months ago

Just submitted PR #1139

It's based on the assumption that making the 'encoder' parameter implicit was a mistake, so it may be wrong. Ideally, adding a test for a specific case covered by PR #1115 would be a good idea.

Let me know if I missed something :)

Not-Aru commented 1 month ago

Hey, when can we expect the PR to be merged? I am working on an implementation that depends on this fix.

algora-pbc[bot] commented 1 month ago

🎉🎈 @ifndev has been awarded $200! 🎈🎊