我使用杰克逊测试了Scala案例类的序列化。
DeserializeTest.java
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类时,抛出了一个异常:
main
[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()。
选项1
您可以使用注释BeanProperty在Scala中创建JavaBean类。
例
case class Person( @BeanProperty val name: String, @BeanProperty val age: Int, @BeanProperty val hobbies: Option[String] )
在这种情况下,val将意味着仅定义了一个吸气剂。如果需要反序列化的设置器,则将属性定义为var。
选项2
尽管选项1可以使用,但是如果您真的想使用Jackson,可以使用一些包装器来处理诸如FasterXML的scala模块之类的Scala类,这可能是一种更好的方法。我没有使用它,因为我只是在使用内置的Json库来播放。