【问题标题】:Serlaize case class with the variable inside it in scala with jacksonSerlaize 案例类及其内部的变量在 scala 中与杰克逊
【发布时间】:2015-07-02 05:05:31
【问题描述】:

我厌倦了使用 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 = ""

}

有什么建议吗?

【问题讨论】:

    标签: java json scala jackson fasterxml


    【解决方案1】:

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

    Example

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

    【讨论】:

    • 感谢您的尝试,最终是一个包装案例类解决了问题。
    【解决方案2】:

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

    首先,我使用 javap(.exe) 从类文件中查看 java 代码,到包含名为 Job 的案例类的 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();
      .
      .
      .
    }
    

    工作类别:

    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 案例类是一个匿名内部类,当你尝试序列化它时(你可以,因为两者都实现了 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

    【讨论】:

      猜你喜欢
      • 2020-11-06
      • 2011-09-29
      • 2011-08-25
      • 2014-08-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-30
      • 1970-01-01
      相关资源
      最近更新 更多