定义同一类不同格式化在同一性状(Define different formatters for sa

2019-10-19 18:20发布

我收到来自不同地方的JSON字符串,我希望构造相同的类实例,问题是从地方我得到一些领域,当我得到处B中的JSON,我得到了相同的字段等等。

我知道有2种方法用于JSON解析:

//Option 1 - Serialize all the fields, if a field is not found on json, it throws exception
implicit val myClassFormat = Json.format[MyClass] //This will format all fields

//Option 2 - Serialize only the fields i want
implicit val myClassFormatCustom = new Format[MyClass]{
def writes(item: MyClass):JsValue = {
  Json.obj(
      "field1" -> item.field1,
      "field2" -> item.field2
      )
}
def reads(json: JsValue): JsResult[MyClass] = 
JsSuccess(new MyClass(
    (json \ "field1").as[Option[String]],
    (json \ "field2").as[Option[String]],

    ))
    }

在我的项目,我有一个格式化特征,我把所有的类格式化的这一特质。
当我需要的东西序列延长我与格式化程序特征的类。

我的问题是,我想打几个格式化程序为同一类,在同一性状 - 然后指定格式的名字我想我的实例类时使用。 我认为它会是这样的:

val myclass:MyClass = Json.parse(someString).as[MyClass] //This is current and not good !
val myclass:MyClass = Json.parse(someString, myClassFormatCustom /*the formatter name*/).as[MyClass]

可能吗 ?

Answer 1:

是的你可以。 首先,如果你想myClassFormat是默认的-它必须是唯一的隐格式(即让myClassFormatCustom没有隐含的)。

然后,你就可以这样做:

val myclass:MyClass = Json.parse(someString).as[MyClass] //default case - uses the implicit format

val mc2 = Json.parse(someString).as(myClassFormatCustom) //custom case - uses the provided Reads or Format


文章来源: Define different formatters for same class in the same trait
标签: json scala