Skip to content

Objects in tuples are not serialized as ids #443

@tremaluca

Description

@tremaluca

Using classes annotated with JsonIdentityInfo inside of tuples has a weir behaviour

@JsonIdentityInfo(generator = classOf[ObjectIdGenerators.IntSequenceGenerator])
case class Foo(x: Int)

case class ManyFooPairs(foos: Seq[(Foo, Foo)])

object Main extends App {
  val mapper = new ObjectMapper().registerModule(DefaultScalaModule)
  val f1 = Foo(1)
  val f2 = Foo(2)
  println(mapper.writeValueAsString(
    ManyFooPairs(Seq((f1, f1), (f1, f2)))
  ))
}

prints

{"foos":[[{"@id":1,"x":1},{"@id":1,"x":1}],[{"@id":1,"x":1},{"@id":1,"x":2}]]}

Introducing a specific pair class solves the issue:

@JsonIdentityInfo(generator = classOf[ObjectIdGenerators.IntSequenceGenerator])
case class Foo(x: Int)

case class FooPair(l: Foo, r: Foo)

case class ManyFooPairs(foos: Seq[FooPair])

object Main extends App {
  val mapper = new ObjectMapper().registerModule(DefaultScalaModule)
  val f1 = Foo(1)
  val f2 = Foo(2)
  println(mapper.writeValueAsString(
    ManyFooPairs(Seq(FooPair(f1, f1), FooPair(f1, f2)))
  ))
}

prints

{"foos":[{"l":{"@id":1,"x":1},"r":1},{"l":1,"r":{"@id":2,"x":2}}]}

Metadata

Metadata

Assignees

Labels

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions