我需要将scala case类的层次结构序列化为JSON,以将它们存储在db中。我当前正在使用json4s,并且效果很好。但是,在用Java反序列化时,杰克逊要求我为case类提供一个空的构造函数(不存在)。
我尝试的另一个选项是在我的Scala库中定义反序列化函数,将其导入Java代码中并在运行时运行它以读取字符串并构建层次结构的相对类。通过这种方式,我可以在Java世界中重建对象。之后,我想返回该对象:如果将其作为对象返回,则无法正确序列化(杰克逊使用的逻辑与json4s不同);如果我使用scala函数,则可以创建一个字符串并将其返回,但是由于某些原因,它可以逃脱返回:
"{\"jsonClass\":\"TimeExtremaConfig\",\"name\":\"payment_first_seen_hotel_id_on_agency\"}
是否有更好的方法来解决此问题?要么找到一种方法来反序列化案例类并在各处使用杰克逊,要么避免在第二种选择中逃脱
答案 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?
虽然看起来不太好,但它告诉杰克逊使用参数化的构造函数,而不是寻找默认的构造函数。