簡體   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