小编典典

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

json

我使用杰克逊测试了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类时,抛出了一个异常:

[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案例类?


阅读 626

收藏
2020-07-27

共1个答案

小编典典

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库来播放。

2020-07-27