反序列化 Java 中的 Scala 反序列化对象
Deserialize Scala deserialized object in Java
======更新=====
对于带有 Jackson 注释的 Scala class 可以在 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: Can not
construct instance of scala.Option, problem: abstract types either
need to be mapped to concrete types, have custom deserializer, or be
instantiated with additional type information
===更新结束====
我有 Scala classes,它们使用 Play json 序列化并通过 rest 服务发送。我想在我的 Java 程序中使用 Scala class 反序列化此 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)
我的主要 objective 是反序列化案例 class。但是我读到 class 不能在不添加杰克逊注释@JSONCreator 的情况下反序列化,我厌倦了添加它,但这也不起作用。
然后我尝试使用常规 scala class,但这也不起作用。我该如何在 java 中使用我的反序列化 Scala classes?
我通过将 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 注释。
======更新=====
对于带有 Jackson 注释的 Scala class 可以在 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: Can not construct instance of scala.Option, problem: abstract types either need to be mapped to concrete types, have custom deserializer, or be instantiated with additional type information
===更新结束====
我有 Scala classes,它们使用 Play json 序列化并通过 rest 服务发送。我想在我的 Java 程序中使用 Scala class 反序列化此 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)
我的主要 objective 是反序列化案例 class。但是我读到 class 不能在不添加杰克逊注释@JSONCreator 的情况下反序列化,我厌倦了添加它,但这也不起作用。
然后我尝试使用常规 scala class,但这也不起作用。我该如何在 java 中使用我的反序列化 Scala classes?
我通过将 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 注释。