使用Jackson来(反)对Scala Case类进行序列化

我使用杰克逊测试了Scala案例类的序列化。

    public static void main(String[] args) throws Exception { // being lazy to catch-all

final ObjectMapper mapper = new ObjectMapper();

final ByteArrayOutputStream stream = new ByteArrayOutputStream();

mapper.writeValue(stream, p.Foo.personInstance());

System.out.println("result:" + stream.toString());

}

}

object Foo {

case class Person(name: String, age: Int, hobbies: Option[String])

val personInstance = Person("foo", 555, Some("things"))

val PERSON_JSON = """ { "name": "Foo", "age": 555 } """

}

当我运行上述mainJava类时,抛出了一个异常:

[error] Exception in thread "main" org.codehaus.jackson.map.JsonMappingException: 

No serializer found for class p.Foo$Person and no properties discovered

to create BeanSerializer (to avoid exception,

disable SerializationConfig.Feature.FAIL_ON_EMPTY_BEANS) )

我如何(反)序列化Scala案例类?

回答:

Jackson希望您的类是JavaBean,这意味着它希望该类的每个属性都具有getX()和/或setX()。

您可以使用注释BeanProperty在Scala中创建JavaBean类。

case class Person(

@BeanProperty val name: String,

@BeanProperty val age: Int,

@BeanProperty val hobbies: Option[String]

)

在这种情况下,val将意味着仅定义了一个吸气剂。如果需要反序列化的设置器,则将属性定义为var。

尽管选项1可以使用,但是如果您真的想使用Jackson,可以使用一些包装器来处理诸如FasterXML的scala模块之类的Scala类,这可能是一种更好的方法。我没有使用它,因为我只是在使用内置的Json库来播放。

以上是 使用Jackson来(反)对Scala Case类进行序列化 的全部内容, 来源链接: utcz.com/qa/418099.html

回到顶部