Класс Serlaize case с переменной внутри него в scala с jackson

я устал сериализовать класс case с помощью 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 = ""

}

Какие-либо предложения ?


person user1120007    schedule 02.07.2015    source источник


Ответы (2)


Джексон использует Getter из стандарта Java Beans для создания json. Попробуйте добавить @BeanProperty к вашим свойствам и параметрам конструктора, чтобы скомпилировать ваш класс с помощью Getter/Setters.

Пример

Или вы можете использовать Scala-Module Джексона. Вы можете взглянуть на их тесты, чтобы узнать, как использовать этот модуль для сериализация.

person Lukas Eichler    schedule 02.07.2015
comment
Спасибо за попытку, в конце концов, это был класс case-оболочки, который доставил неприятности. - person user1120007; 03.07.2015

Итак, есть некоторые проблемы с сериализацией, некоторые из них легкие, но я узнаю кое-что, что может помочь другим людям с этой проблемой и пониманием класса case в целом.

Во-первых, я использовал javap(.exe) для просмотра java-кода из файлов классов в Job.scala с содержащимся классом case с именем Job, есть два файла классов: 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();
  .
  .
  .
}

Работа.класс:

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 в другую иерархию классов с использованием Джексона

person user1120007    schedule 06.07.2015