次のような JSON があります。
{
"switch": "foo",
"items": [
{"type": "one"},
{"type": "two"}
]
}
そのようなクラスの構造にロードしたい:
case class MyFile(
@JsonProperty("switch") _switch: String,
@JsonProperty("items") _items: JList[Item],
) {
val items: List[Item] = _items.toList
}
case class Item(t: String)
object Item {
@JsonCreator
def create(@JsonProperty("type") _type: String): Item = {
Item(t) // <= conversion
}
}
秘訣は、「スイッチ」の値に依存する何らかの関数を使用して、受信した「タイプ」文字列を変換したいということです。最も単純な例は次のようなものです
def create(@JsonProperty("type") _type: String): Item = {
Item(t + "_" + switchValue)
}
@JsonCreator
ただし、構文解析中 (つまり、コンストラクターまたは静的メソッド内)で JSON ツリーの一部にアクセスする方法が見つからないようです。
私がこれまでに持ってきた唯一のものは、基本的に次のようなグローバル変数です:
case class MyFile(
@JsonProperty("switch") _switch: String,
@JsonProperty("items") _items: JList[Item],
) {
MyFile.globalSwitch = _switch
val items: List[Item] = _items.toList
}
object MyFile {
var globalSwitch = ""
}
case class Item(t: String)
object Item {
@JsonCreator
def create(@JsonProperty("type") _type: String): Item = {
Item(t + "_" + MyFile.globalSwitch) // <= conversion
}
}
それは機能しますが、明らかにかなり醜いです。たとえば、異なるスイッチ値を持つ2つのファイルを並行して解析することはできません。より良い解決策はありますか? たとえば、ObjectMapper ごとまたは解析ごとの何らかのコンテキストにアクセスして、この設定を保存できるのではないでしょうか?