使用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 } """
}
当我运行上述main
Java类时,抛出了一个异常:
[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