我厌倦了使用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 = ""
}
有什么建议吗?
答案 0 :(得分:0)
杰克逊使用Java Beans标准的Getter来构建json。尝试将@BeanProperty
添加到属性和构造函数参数中,以使用Getter / Setters编译您的类。
或者你可以使用杰克逊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