Extraction of Option[Int] does not work when multiple constructors are present
Open
Nobody has claimed this yet.
- Dominant language
- Scala
- Stars
- 1.5k
- Forks
- 324
- Avg merge
- 4h 35m
- Merged PRs (30d)
- 30
Description
json4s version
3.5.3
scala version
2.11
scala> :paste
// Entering paste mode (ctrl-D to finish)
case class B(b1: String)
case class A(a1: String, a2: Option[Int], b: B) {
def this(a1: String, a2: Option[Int])(implicit b: B, d1: DummyImplicit) = {
this(a1, a2, b)
}
}
val json = """ {"a1" : "a1", "a2" : 4, "b" : {"b1" : "b1"}}"""
org.json4s.jackson.JsonMethods.parse(json).extract[A]
// Exiting paste mode, now interpreting.
org.json4s.package$MappingException: Can't find constructor for A
at org.json4s.reflect.ScalaSigReader$.readConstructor(ScalaSigReader.scala:37)
at org.json4s.reflect.Reflector$ClassDescriptorBuilder.ctorParamType(Reflector.scala:104)
at org.json4s.reflect.Reflector$ClassDescriptorBuilder$$anonfun$6.apply(Reflector.scala:94)
at org.json4s.reflect.Reflector$ClassDescriptorBuilder$$anonfun$6.apply(Reflector.scala:91)
at scala.collection.immutable.List.map(List.scala:273)
at org.json4s.reflect.Reflector$ClassDescriptorBuilder.ctorParamType(Reflector.scala:91)
at org.json4s.reflect.Reflector$ClassDescriptorBuilder$$anonfun$createConstructorDescriptors$3$$anonfun$15.apply(Reflector.scala:150)
at org.json4s.reflect.Reflector$ClassDescriptorBuilder$$anonfun$createConstructorDescriptors$3$$anonfun$15.apply(Reflector.scala:135)
at scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:234)
at scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:234)
at scala.collection.mutable.ResizableArray$class.foreach(ResizableArray.scala:59)
at scala.collection.mutable.ArrayBuffer.foreach(ArrayBuffer.scala:48)
at scala.collection.TraversableLike$class.map(TraversableLike.scala:234)
at scala.collection.AbstractTraversable.map(Traversable.scala:104)
at org.json4s.reflect.Reflector$ClassDescriptorBuilder$$anonfun$createConstructorDescriptors$3.apply(Reflector.scala:135)
at org.json4s.reflect.Reflector$ClassDescriptorBuilder$$anonfun$createConstructorDescriptors$3.apply(Reflector.scala:129)
at scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:234)
at scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:234)
at scala.collection.mutable.ArraySeq.foreach(ArraySeq.scala:74)
at scala.collection.TraversableLike$class.map(TraversableLike.scala:234)
at scala.collection.AbstractTraversable.map(Traversable.scala:104)
at org.json4s.reflect.Reflector$ClassDescriptorBuilder.createConstructorDescriptors(Reflector.scala:129)
at org.json4s.reflect.Reflector$ClassDescriptorBuilder.constructorsAndCompanion(Reflector.scala:114)
at org.json4s.reflect.Reflector$ClassDescriptorBuilder.result(Reflector.scala:178)
at org.json4s.reflect.Reflector$.createDescriptor(Reflector.scala:46)
at org.json4s.reflect.Reflector$$anonfun$describe$1.apply(Reflector.scala:40)
at org.json4s.reflect.Reflector$$anonfun$describe$1.apply(Reflector.scala:40)
at org.json4s.reflect.package$Memo.apply(package.scala:36)
at org.json4s.reflect.Reflector$.describe(Reflector.scala:40)
at org.json4s.Extraction$.extract(Extraction.scala:387)
at org.json4s.Extraction$.extract(Extraction.scala:43)
at org.json4s.ExtractableJsonAstNode.extract(ExtractableJsonAstNode.scala:21)
... 47 elided
Changing Option[Int] to Int works fine.
scala> :paste
// Entering paste mode (ctrl-D to finish)
case class B(b1: String)
case class A(a1: String, a2: Int, b: B) {
def this(a1: String, a2: Int)(implicit b: B, d1: DummyImplicit) = {
this(a1, a2, b)
}
}
val json = """ {"a1" : "a1", "a2" : 4, "b" : {"b1" : "b1"}}"""
org.json4s.jackson.JsonMethods.parse(json).extract[A]
// Exiting paste mode, now interpreting.
defined class B
defined class A
json: String = " {"a1" : "a1", "a2" : 4, "b" : {"b1" : "b1"}}"
res29: A = A(a1,4,B(b1))
Contributor guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Research direction
Reproduce the Scala 2.11 example against json4s 3.5.3, then start with the stack-trace locations in ScalaSigReader.scala and Reflector.scala. Compare extraction with Option[Int] against the working Int case and verify that A can be extracted when both constructors are present.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- scala
- Domain
- backend-api-design
- Issue type
- Bug
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Activity status
- Stale
- Clarity
- Mostly clear
- Newbie friendliness
- 35/100