加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

如何使用*非case *类从Scala反序列化JSON?

发布时间:2020-12-16 18:57:32 所属栏目:安全 来源:网络整理
导读:我正在编写一个需要从 JSON序列化和反序列化的Scala应用程序.一些JSON对象有超过22个字段,所以我不能使用case类(我也不能改变格式).我能够找到的所有Scala JSON库只能使用case类(而不是普通类)工作. 鉴于此,将大型JSON对象(具有超过22个字段)反序列化为Scala
我正在编写一个需要从 JSON序列化和反序列化的Scala应用程序.一些JSON对象有超过22个字段,所以我不能使用case类(我也不能改变格式).我能够找到的所有Scala JSON库只能使用case类(而不是普通类)工作.

鉴于此,将大型JSON对象(具有超过22个字段)反序列化为Scala非案例类的最简单方法是什么?它不一定是完全自动的,但理想情况下我正在寻找比反序列化为Map [String,Any]并手动完成所有操作更少痛苦的事情.

解决方法

更新:幸运的是,现在可以使用字段序列化器使用Json4s和Jackson进行我想要的操作,如下所示:

implicit val formats = DefaultFormats + FieldSerializer[MyNonCaseClass]()

val myNonCaseClassObject = Serialization.read[MyNonCaseClass](jsonString)

按照下面的要求,这是一个更完整的例子:

import org.json4s.jackson.Serialization
import org.json4s._
import scala.util.Try

object JSONUtil {

implicit val formats = DefaultFormats + FieldSerializer[MyNonCaseClass]() + FieldSerializer[MyOtherNonCaseClass](ignore("someUnwantedFieldName") orElse ignore("anotherFieldToIgnore")) + ...

def toJSON(objectToWrite: AnyRef): String = Serialization.write(objectToWrite)

def fromJSONOption[T](jsonString: String)(implicit mf: Manifest[T]): Option[T] = Try(Serialization.read(jsonString)).toOption

}

那么用法是:

val jsonString = JSONUtil.toJSON(myObject)
val myNewObject: Option[MyClass] = JSONUtil.fromJSONOption[MyClass](aJsonString)

您需要为要序列化的每个非案例类使用FieldSerializer.此外,在定义类时,JSON中可能缺少的所有内容都需要定义为Option.

SBT:

"org.json4s" %% "json4s-jackson" % "3.2.6"

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读