在Java中反序列化Scala反序列化对象

时间:2017-03-11 19:56:35

标签: java scala jackson json-deserialization

==更新=====

对于带有Jackson注释的Scala类,可以用Java序列化。

case class B @JsonCreator()(@JsonProperty("test")test: Boolean)

这有效(照顾早期的问题)。但是如果我使用Option [Boolean] ..

case class B @JsonCreator()(@JsonProperty("test")test: Option[Boolean])

反序列化的Java代码

mapper.readValue("{\"test\": false}", B.class);

抛出异常

  

com.fasterxml.jackson.databind.JsonMappingException:不能   构造scala的实例。选项,问题:抽象类型   需要映射到具体类型,具有自定义反序列化器,或者   用其他类型信息实例化

===更新结束====

我有Scala类,使用Play json序列化并通过rest服务发送。我想使用Scala类在我的Java程序中反序列化这个json。用例子说明:

//A.scala
package my.scala
class A (test: Boolean)

//B.scala
package my.scala

case class B(test: Boolean)


//MyProg.java
package my.java
import com.fasterxml.jackson.databind.ObjectMapper;
public class MyProg {

ObjectMapper mapper = new ObjectMapper();
mapper.readValue("{\"test\": false}", A.class);

//this one too fails.
//mapper.readValue("""{"test": false}""", B.class);
}

我在mapper.ReadValue

上得到以下异常
com.fasterxml.jackson.databind.JsonMappingException: No suitable constructor found for type [simple type, class my.java.A]: can not instantiate from JSON object (need to add/enable type information?)
 at [Source: {
  "test": false
}; line: 2, column: 3]
    at com.fasterxml.jackson.databind.JsonMappingException.from(JsonMappingException.java:148)

我的主要目标是反序列化案例类。但是我读到如果没有添加杰克逊注释@JSONCreator就不能反序列化案例类,我累了补充说,但这也不起作用。

然后我尝试使用常规的scala类,但这也不起作用。我如何在java中使用反序列化的scala类?

1 个答案:

答案 0 :(得分:1)

我通过将ScalaModule注册到我的对象映射器

来解决了这个问题
//MyProg.java
package my.java
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.module.scala.DefaultScalaModule;

public class MyProg {

ObjectMapper mapper = new ObjectMapper().registerModule(new DefaultScalaModule());

mapper.readValue("{\"test\": false}", A.class);

mapper.readValue("""{"test": false}""", B.class);
}

需要在scala对象上使用@JacksonCreatoer和@JacksonProperty注释。