在 scala play 中针对不同的情况 类 使用不同的 JsonNaming 策略

Using different JsonNaming strategies for different case classes in scala play

我有两条不同的 JSON 消息,我想将其转换为案例 classes 的实例。

case class ThisThing(attributeOne: String)
case class ThatThing(attributeTwo: String)

implicit val config: Aux[Json.MacroOptions] = JsonConfiguration(SnakeCase)
implicit val thisThingFormat: OFormat[ThisThing] = Json.format[ThisThing]
implicit val thatThingFormat: OFormat[ThatThing]= Json.format[ThatThing]

我现在可以像这样解析消息:

val thisThing = Json.fromJson[ThisThing](Json.parse("{\"attribute_one\": \"hurray\"}"))

但是,我的 ThatThing JSON 消息不是蛇形的,它们的属性匹配大小写 class:

val thatThing = Json.fromJson[ThatThing](Json.parse("{\"attributeTwo\": \"hurray\"}"))

这会出错,因为它正在寻找名为 attribute_two 的属性以映射到 attributeTwo

如何仅针对特定情况 classes 指定 SnakeCase 的命名策略?

与任何 implicit 一样,配置可以限定范围:

import play.api.libs.json._

case class ThisThing(attributeOne: String)
case class ThatThing(attributeTwo: String)

implicit val thisThingFormat: OFormat[ThisThing] = {
  implicit val config = JsonConfiguration(JsonNaming.SnakeCase)

  Json.format[ThisThing]
}

implicit val thatThingFormat: OFormat[ThatThing] = Json.format[ThatThing]

然后:

Json.fromJson[ThisThing](Json.parse("{\"attribute_one\": \"hurray\"}"))
// res0: play.api.libs.json.JsResult[ThisThing] = JsSuccess(ThisThing(hurray),)

Json.fromJson[ThatThing](Json.parse("{\"attributeTwo\": \"hurray\"}"))
// res1: play.api.libs.json.JsResult[ThatThing] = JsSuccess(ThatThing(hurray),)