【发布时间】:2019-09-17 07:11:45
【问题描述】:
为什么在反序列化为案例类实例之后,结构相等比较会受到案例类定义的位置在另一个类内部或外部的影响。比如下面sn -p中的断言
package example
import org.json4s.DefaultFormats
import org.json4s.native.JsonMethods.parse
class Foo {
case class Person(name: String)
def bar = {
implicit val formats = DefaultFormats
val expected = Person(name = "picard")
val actual = parse("""{"name": "picard"}""").extract[Person]
assert(expected == actual, s"$expected == $actual")
}
}
object Main extends App {
(new Foo).bar
}
失败
`java.lang.AssertionError: assertion failed: Person(picard) == Person(picard)`
如果我们像这样将 Person 定义移到 class Foo 之外,它就会通过
case class Person(name: String)
class Foo {
def bar = {
...
assert(expected == actual, s"$expected == $actual")
}
}
注意,在这两种情况下,反序列化似乎都是成功的,例如,
assert(expected.name == actual.name)
无论case class Person 定义位置如何,都可以满足。
也许它受到传递给extract 的隐式Manifest 的影响?
【问题讨论】:
-
如果你将
Foo设为内部Person的对象,你将拥有Exception in thread "main" org.json4s.package$MappingException: unknown errorCaused by: java.lang.NullPointerException -
我无法复制它。
object Foo { case class Person(name: String) ...似乎没有给我抛出异常。 -
我把它们做成了内部
object App { object Foo { case class Person(name: String) ... -
Scala 2.12.8 + json4s-native 3.6.5