微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

java – 使用Jackson来(De) – 对Scala案例类进行序列化

我使用Jackson测试了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());
    }
}

Foo.scala

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 } """
}

当我运行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) )

我如何(de)-serial化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将仅表示定义了一个吸气剂.如果需要用于反序列化的setter,则将属性定义为var.

选项2

虽然选项1可行,但如果你真的想使用Jackson,那么有一些包装器可以让它处理像FasterXML’s scala module这样的Scala类,这可能是一个更好的方法.我没有使用它,因为我刚刚使用内置的Json库来玩.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐