0

我正在尝试使用 jackson json4s 反序列化一个简单的 json 字符串。我已经能够让它在 scala 2.11 中工作,但是在升级到 2.12 时,我看到了这个错误:

  import org.json4s._
  import org.json4s.jackson.Serialization.read
    
  implicit val formats: DefaultFormats.type = DefaultFormats

  case class Person(val name: String, val address: Option[String])

在 Scala 2.11 中,当我运行代码集时,我得到以下信息:

  println(jackson.parseJson(f"""{ "name": "foo" }""").extract[Person])

  Result: Person(foo,None)

在 Scala 2.12 中,我得到以下信息:

  println(jackson.parseJson(f"""{ "name": "foo" }""").extract[Person])

  org.json4s.package$MappingException: unknown error
  at org.json4s.Extraction$.extract(Extraction.scala:43)
  at org.json4s.ExtractableJsonAstNode.extract(ExtractableJsonAstNode.scala:21)
  ... 52 elided
Caused by: java.lang.IndexOutOfBoundsException: 2
  at scala.collection.immutable.Vector.checkRangeConvert(Vector.scala:127)
  at scala.collection.immutable.Vector.apply(Vector.scala:118)
  at org.json4s.reflect.Reflector$ClassDescriptorBuilder.$anonfun$createConstructorDescriptors$6(Reflector.scala:156)
  at scala.collection.TraversableLike.$anonfun$map$1(TraversableLike.scala:238)
  at scala.collection.mutable.ResizableArray.foreach(ResizableArray.scala:62)
  at scala.collection.mutable.ResizableArray.foreach$(ResizableArray.scala:55)
  at scala.collection.mutable.ArrayBuffer.foreach(ArrayBuffer.scala:49)
  at scala.collection.TraversableLike.map(TraversableLike.scala:238)
  at scala.collection.TraversableLike.map$(TraversableLike.scala:231)
  at scala.collection.AbstractTraversable.map(Traversable.scala:108)
  at org.json4s.reflect.Reflector$ClassDescriptorBuilder.$anonfun$createConstructorDescriptors$3(Reflector.scala:142)
  at scala.collection.TraversableLike.$anonfun$map$1(TraversableLike.scala:238)
  at scala.collection.mutable.ArraySeq.foreach(ArraySeq.scala:75)
  at scala.collection.TraversableLike.map(TraversableLike.scala:238)
  at scala.collection.TraversableLike.map$(TraversableLike.scala:231)
  at scala.collection.AbstractTraversable.map(Traversable.scala:108)
  at org.json4s.reflect.Reflector$ClassDescriptorBuilder.createConstructorDescriptors(Reflector.scala:136)
  at org.json4s.reflect.Reflector$ClassDescriptorBuilder.constructorsAndCompanion(Reflector.scala:121)
  at org.json4s.reflect.Reflector$ClassDescriptorBuilder.result(Reflector.scala:183)
  at org.json4s.reflect.Reflector$.createDescriptor(Reflector.scala:53)
  at org.json4s.reflect.Reflector$.$anonfun$describe$1(Reflector.scala:48)
  at org.json4s.reflect.package$Memo.apply(package.scala:36)
  at org.json4s.reflect.Reflector$.describe(Reflector.scala:48)
  at org.json4s.Extraction$.$anonfun$extract$9(Extraction.scala:393)
  at org.json4s.Extraction$.customOrElse(Extraction.scala:606)
  at org.json4s.Extraction$.extract(Extraction.scala:392)
  at org.json4s.Extraction$.extract(Extraction.scala:39)
  ... 53 more

我正在使用以下版本的 json4s 库:

斯卡拉 2.11

  • json4s-ast_2.11-3.5.3.jar
  • json4s-core_2.11-3.5.3.jar
  • json4s-jackson_2.11-3.5.3.jar
  • json4s-scalap_2.11-3.5.3.jar

斯卡拉 2.12

  • json4s-ast_2.12-3.5.3.jar
  • json4s-core_2.12-3.5.3.jar
  • json4s-jackson_2.12-3.5.3.jar
  • json4s-scalap_2.12-3.5.3.jar

请你能告诉我我在这里做错了什么吗?

4

2 回答 2

3

根据我的经验(json4s 3.5.3 和 3.6.4):

class Test {
   case class Foo(foo: String, bar: Map[String, Int])
   implicit val formats = org.json4s.DefaultFormat
   val foo = Foo("foo", bar = Map("bar" -> 1, "baz" -> 2))

   org.json4s.Extraction.decompose(foo)
}

适用于 scala-2.11 但OutOfBoundException在 scala-2.12 中失败。

修复:在伴随对象中定义您的案例类

class Test {
   implicit val formats = org.json4s.DefaultFormat
   val foo = Test.Foo("foo", bar = Map("bar" -> 1, "baz" -> 2))

   org.json4s.Extraction.decompose(foo)
}
object Test {
   case class Foo(foo: String, bar: Map[String, Int])
}

这适用于 scala-2.11 和 scala-2.12

于 2020-11-25T16:05:01.680 回答
0

我无法重现该问题。我将 json4s-core_2.12-3.5.3 和 json4s-jackson_2.12-3.5.3 与 Scala 2.12.10 一起使用,但它解析正确。请参阅https://scastie.scala-lang.org/IMs6t86PTlyfS9F00V32vw

于 2020-08-03T16:17:20.927 回答