使用jackson在scala中序列化包含变量的case类



我很累使用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 反序列化到另一个类层次结构

相关内容

  • 没有找到相关文章

最新更新