繁体   English   中英

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

[英]Serialize Scala case classes and deserialize them in Java

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

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

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

有没有更好的方法来解决此问题? 寻找一种方法来反序列化案例类并在各处使用杰克逊,或者避免在第二种方法中进行转义

您是否尝试过使用Jackson Scala模块

Scala中处理案例类实例的工作非常出色:

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")
}

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

而且您可以从Java方面有效地做同样的事情(请原谅集合互操作):

final ObjectMapper mapper = new ObjectMapper();
mapper.registerModule(new DefaultScalaModule());

final Child alice = new Child("Alice");
final List<Child> children = new ArrayList<>();
children.add(alice);

final String bobString = mapper.writeValueAsString(
  new Parent("Bob", 
    JavaConversions.asScalaBuffer(children).toList()));
System.out.println(bobString);

final Parent bob = mapper.readValue(bobString, Parent.class);
System.out.println(bob);

听起来您已经控制了scala库,如何通过case类尝试JsonCreator批注? 我们必须在Scala案例类中使用@JsonProperty吗?

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM