==更新=====
对于带有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类?
答案 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注释。