序列化Scala用例类并在Java中反序列化它们

时间:2019-04-17 21:18:16

标签: java scala jackson

我需要将scala case类的层次结构序列化为JSON,以将它们存储在db中。我当前正在使用json4s,并且效果很好。但是,在用Java反序列化时,杰克逊要求我为case类提供一个空的构造函数(不存在)。

我尝试的另一个选项是在我的Scala库中定义反序列化函数,将其导入Java代码中并在运行时运行它以读取字符串并构建层次结构的相对类。通过这种方式,我可以在Java世界中重建对象。之后,我想返回该对象:如果将其作为对象返回,则无法正确序列化(杰克逊使用的逻辑与json4s不同);如果我使用scala函数,则可以创建一个字符串并将其返回,但是由于某些原因,它可以逃脱返回:

"{\"jsonClass\":\"TimeExtremaConfig\",\"name\":\"payment_first_seen_hotel_id_on_agency\"}

是否有更好的方法来解决此问题?要么找到一种方法来反序列化案例类并在各处使用杰克逊,要么避免在第二种选择中逃脱

2 个答案:

答案 0 :(得分:0)

您是否尝试过使用Jackson Scala Module

在处理 Scala 中的案例类实例方面做得非常好:

const subscriber = require('redis').createClient(port, host);

subscriber.subscribe('__keyevent@0__:expired');

subscriber.on('message', async (channel, key) => {
    // do somenthing
}

胜利:

case class Parent(name: String, children: List[Child])
case class Child(name: String)

def test(): Unit = {

  val mapper = new ObjectMapper() with ScalaObjectMapper
  mapper.registerModule(DefaultScalaModule)

  val bobString = mapper.writeValueAsString(Parent("Bob", List(Child("Alice"))))
  println(s"String: $bobString")

  val bob = mapper.readValue[Parent](bobString)
  println(s"Object: $bob")
}

并且您可以从 Java 方面有效地进行相同操作(请原谅集合互操作):

String: {"name":"Bob","children":[{"name":"Alice"}]}
Object: Parent(Bob,List(Child(Alice)))

答案 1 :(得分:0)

听起来好像您已经控制了scala库,如何通过case类尝试JsonCreator批注? Must we use @JsonProperty in Scala case classes?

虽然看起来不太好,但它告诉杰克逊使用参数化的构造函数,而不是寻找默认的构造函数。