用jackson中的scala里面的变量Serlaize case类

时间:2015-07-02 05:05:32

标签: java json scala jackson fasterxml

我厌倦了使用jackson fasterxml序列化一个案例类,我可以在反序列化(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 = ""

}

有什么建议吗?

2 个答案:

答案 0 :(得分:0)

杰克逊使用Java Beans标准的Getter来构建json。尝试将@BeanProperty添加到属性和构造函数参数中,以使用Getter / Setters编译您的类。

Example

或者你可以使用杰克逊Scala-Module。您可以查看他们的测试,了解如何将此模块用于serialization

答案 1 :(得分:0)

因此,序列化存在一些问题,有些问题很容易,但我学到的东西可以帮助其他人解决这个问题以及对案例类的理解。

首先,我使用javap(.exe)查看类文件中的java代码,使用包含名为Job的case类的Job.scala,有两个类文件: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$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 Json deserialization into another class hierarchy using Jackson