我很累使用jackson fasterxml序列化case类,我可以看到反序列化后的构造函数参数(taskRequest和taskNameIn(,但不能看到类内的变量(例如jobsRequest为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/Setter编译类。
示例
或者您可以使用Jackson Scala模块。您可以查看他们的测试,了解如何使用此模块进行序列化。
因此,序列化存在一些问题,有些问题很容易,但我学到了一些东西,这些东西可能有助于其他人解决这个问题,以及对case类的理解。
首先,我使用javap(.exe(来查看类文件中的java代码,到Job.scala(包含名为Job的case类(,有两个类文件: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();
.
.
.
}
作业类别:
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=527Json使用Jackson 反序列化到另一个类层次结构