【发布时间】:2019-04-23 20:05:57
【问题描述】:
我有一个包含超过 22 个参数的案例类。
case class Model(a1: Int,
a2: Int,
a3: Int,
a4: Int,
a5: Int,
a6: Int,
a7: Int,
a8: Int,
a9: Int,
a10: Int,
a11: Int,
a12: Int,
a13: Int,
a14: Int,
a15: Int,
a16: Int,
a17: Int,
a18: Int,
a19: Int,
a20: Int,
a21: Int,
a22: Int,
a23: Int,
a24: Int)
我得到一个 json 输入,我需要将其反序列化为上述 Model 案例类。但是,我的输入 json 不包含字段 a1 和 a2。我的 json 看起来像这样
{
"a3": 3,
"a4": 4,
"a5": 5,
"a6": 6,
"a7": 7,
"a8": 8,
"a9": 9,
"a10": 10,
"a11": 11,
"a12": 12,
"a13": 13,
"a14": 14,
"a15": 15,
"a16": 16,
"a17": 17,
"a18": 18,
"a19": 19,
"a20": 20,
"a21": 21,
"a22": 22,
"a23": 23,
"a24": 24
}
现在,为了适应这种情况,我编写了我的自定义 json 阅读器,它将为 json 中的字段 a1 和 a2 添加一些虚拟值。
我有一个自定义方法可以将字段添加到读取的输入 json。扩展方法addField如下
implicit class ReadOps[A](reads: Reads[A]) {
def addField(fieldName: String, value: Int): Reads[A] = Reads {
json: JsValue =>
json
.validate(__.json.update((__ \ fieldName).json.put(JsString(value.toString))))
.map(_.asInstanceOf[A])
}
}
我的隐式json格式如下
implicit val jsonFormat = new OFormat[Model] {
override def reads(json: JsValue): JsResult[Model] = {
Jsonx.formatCaseClass[Model].addField("a1",1).addField("a2",2).reads(json)
}
override def writes(o: Model): JsObject = {
Jsonx.formatCaseClass[Model].writes(o)
}
}
我面临的问题
尽管调用 addField 方法两次(我试图添加值为 1 的 a1 和值为 2 的 a2),但只有值为 1 的字段 a1 被添加到 json 中,而 a2 被忽略。并且 json 不会反序列化为模型案例类。
我正在使用以下依赖项
libraryDependencies += "ai.x" %% "play-json-extensions" % "0.30.1"
请让我知道我在这种方法中哪里出错了。任何指针都会非常有帮助。提前谢谢!!!
注意:- 请不要建议解决方案,例如在模型案例类中添加 a1 和 a2 作为字段。这是毫无疑问的,因为我的实际问题非常复杂,而且 stackoverflow 上的这个问题是手头问题的一个非常简化的版本。
【问题讨论】:
-
谢谢,但我正在寻找使用 play-json 扩展的解决方案
-
这个限制已经从 scala 2.11 中移除。请参考underscore.io/blog/posts/2016/10/11/twenty-two.html