[英]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.