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