簡體   English   中英

用傑克遜在Scala中對其中包含變量的案例類進行Serlaize

[英]Serlaize case class with the variable inside it in scala with jackson

很想使用jackson fastxml序列化一個案例類,我可以在反序列化后看到構造函數參數(taskRequest和taskNameIn),但是看不到類內部的變量(例如,jobsRequests為null):

//@JsonIgnoreProperties(ignoreUnknown = true) // tried to remove it with no luck
@JsonAutoDetect
case class Job(taskRequest: List[TaskRequest] = Nil,taskNameIn:String) {
{
this.jobsRequests = taskRequest
    this.taskName= taskNameIn
}
@JsonProperty
@volatile private var jobsRequests: List[TaskRequest] = Nil 

@JsonProperty
var task_name: String = ""

}

有什么建議么 ?

Jackson使用Java Beans標准中的Getter構造json。 嘗試將@BeanProperty添加到屬性和構造函數參數中,以使用Getter / Setters編譯類。

或者,您可以使用Jackson Scala-Module 您可以看一下他們的測試,以了解如何使用此模塊進行序列化

因此,在其中存在一些序列化問題,在某些情況下比較容易,但是我學到了一些可以幫助其他人解決此問題以及對案例類有所了解的知識。

首先,我使用javap(.exe)從類文件中查看Java代碼,再到包含名為Job的案例類的Job.scala,有兩個類文件:Job $ .class和Job.class。

Job $ .class:

public final class logic.Queue.Task.Job$ extends scala.runtime.AbstractFunction4<java.lang.Object, java.lang.String,   scala.collection.immutable.List<logic.Job.TaskRequest>, org.Server.Job.TaskContainer, logic.Queue.Task.Job>     implements scala.Serializable {
  public static final logic.Queue.Task.Job$ MODULE$;
  public static {};
  public final java.lang.String toString();
  .
  .
  .
}

Job.class:

public class logic.Queue.Task.Job implements scala.Product,scala.Serializable {
  public static org.Server.Job.TaskContainer apply$default$4();
  public static scala.collection.immutable.List<logic.Job.TaskRequest> apply$default$3();
  .
  .
  .
}

這意味着scala case類是一個匿名內部類,當您嘗試對其進行序列化時(並且由於這兩個都實現了scala.Serializable,因此可以實現),我通過添加以下簽名來解決它:

@JsonAutoDetect
@JsonTypeInfo(use = JsonTypeInfo.Id.CLASS, include = JsonTypeInfo.As.PROPERTY, property = "@class")
@JsonCreator
case class Job(stat: Int = CmsTypeMsg.Pending, jobName: String = "", taskRequestIn: List[TaskRequest] = Nil, taskIn: TaskContainer = new TaskContainer()) 

有關此問題的更多幫助: http: //www.jpalomaki.fi/ ? p = 527使用Jackson將Json反序列化為另一個類層次結構

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM