json4s icon indicating copy to clipboard operation
json4s copied to clipboard

ShortTypeHints does not work with `object`

Open delenius opened this issue 3 years ago • 1 comments

json4s version

4.1.0-M2

scala version

2.13.10

jdk version

AdoptOpenJDK Java 11.0.6

Example to reproduce below. The first test succeeds. The second test fails.

import org.json4s.ShortTypeHints
import org.json4s.native.Serialization
import org.scalatest.funsuite.AnyFunSuite

trait TopTrait

case class EmptyCaseClass() extends TopTrait

object AnObject extends Top

class JsonObjectTest extends AnyFunSuite {

  implicit val formats = Serialization.formats(ShortTypeHints(List(
    classOf[EmptyCaseClass],
    AnObject.getClass
  ), "node_type"))

  test("Empty Case Class") {
    val jsonStr =
      """{
        |   "node_type": "EmptyCaseClass"
        |}
        |""".stripMargin
    val result = Serialization.read[TopTrait](jsonStr)
    println(result)
  }

  test("Object") {
    val jsonStr =
      """{
        |   "node_type": "AnObject"
        |}
        |""".stripMargin
    val result = Serialization.read[TopTrait](jsonStr)
    println(result)
  }

}

delenius avatar Nov 01 '22 15:11 delenius

@delenius Assuming that object AnObject extends TopTrait.

If your trait can be sealed then you can use jsoniter-scala as a workaround:

import org.scalatest.funsuite.AnyFunSuite
import com.github.plokhotnyuk.jsoniter_scala.core._
import com.github.plokhotnyuk.jsoniter_scala.macros._

sealed trait TopTrait

case class EmptyCaseClass() extends TopTrait

object AnObject extends TopTrait

class JsonObjectTest extends AnyFunSuite {

  implicit val codec: JsonValueCodec[TopTrait] =
    JsonCodecMaker.make[TopTrait](CodecMakerConfig.withDiscriminatorFieldName(Some("node_type")))

  test("Empty Case Class") {
    val jsonStr =
      """{
        |   "node_type": "EmptyCaseClass"
        |}
        |""".stripMargin
    val result = readFromString[TopTrait](jsonStr)
    println(result)
  }

  test("Object") {
    val jsonStr =
      """{
        |   "node_type": "AnObject"
        |}
        |""".stripMargin
    val result = readFromString[TopTrait](jsonStr)
    println(result)
  }

}

plokhotnyuk avatar Nov 01 '22 16:11 plokhotnyuk