首页 > 解决方案 > 反序列化后受案例类定义位置影响的结构平等

问题描述

为什么在反序列化为案例类实例之后,结构相等比较会受到案例类定义的位置在另一个类内部或外部的影响。例如,以下代码段中的断言

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定义位置如何,都满足。

也许它受到隐式Manifest传递到的某种影响extract

标签: scalaequalsjson4s

解决方案


这是一个错误。

https://github.com/json4s/json4s/issues/564 “反序列化的内部案例类无法与代码中初始化的案例类进行比较”


推荐阅读