Serlaize case class 里面的变量在 scala with jackson 中

Serlaize case class with the variable inside it in scala with jackson

我厌倦了使用 jackson fasterxml 序列化案例 class,我可以在反序列化后看到构造函数参数(taskRequest 和 taskNameIn),但看不到 class 中的变量(例如,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 编译您的 class。

Example

或者您可以使用 Jackson Scala-Module. You can take a look at their tests to see how to use this module for serialization

所以在序列化方面存在一些问题,有些问题很简单,但我学到了一些可以帮助其他人解决这个问题以及对案例 class 的一般理解的东西。

首先,我使用 javap(.exe) 从 class 文件中查看 java 代码,到包含大小写 class 的 Job.scala ] 命名为 Job,有两个 class 文件:Job$.class 和 Job.class.

工作$.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();
  public static scala.collection.immutable.List<logic.Job.TaskRequest> apply$default();
  .
  .
  .
}

意味着 scala 案例 class 是一个匿名内部 class 并且当你尝试序列化它时(你可以因为两个实现 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 Json deserialization into another class hierarchy using Jackson