私はを使用していくつかのjsonを生成しようとしています json4s ネストされたタプル構造に基づいたdslを使用してjsonを構築するライブラリ。スカラを持っています Seq
次のようにタプルのネストに変換できるようにしたいと思います。
// scala Seq
val s = Seq("a", "b", "c", "d")
val rootItem = "id" -> 1234
// desired json
{
"a" : {
"b" : {
"c" : {
"d" : {
"id" : 1234
}
}
}
}
}
型を無視するように強制すると、次のように目的のタプル構造を生成できます。
// yields ("a", ("b", ("c", ("d", ("id", 1234)))))
s.foldRight[Any](rootItem)(_ -> _)
ただし、結果のタイプは Any
これをJSONに書き込む暗黙的な変換実際の型が正しいにもかかわらず、発火しない(および明示的に呼び出されたときに例外をスローする)。このデータ構造を型保証された方法で構築する方法に途方に暮れている。理想的には、型を適切に構築できるソリューションが欲しいのですが、実行時にのみ利用可能な情報(リストの長さ)を必要とするので、不可能かもしれないことを理解しています。法案に収まる可能性があるように見えますが、私は「このケースでそれらを動作させる方法を理解できず、それらが「実際の」システムに対して安全かどうかを知りません。
回答:
回答№1は1アキュムレータは常に同じタイプでなければならないので、あなたは「普通の古い折り目でこれを行うことができません。
ただし、次のようにJSONへの変換を行うことができます。
val s = Seq("a", "b", "c", "d")
val rootItem = "id" -> 1234
import org.json4s._
import org.json4s.JsonDSL._
import org.json4s.jackson.JsonMethods._
val json = s.foldRight[JObject](rootItem)(_ -> _)
そして、次のことができます。 json
として静的に入力されます JObject
:
scala> pretty(render(json))
res0: String =
{
"a" : {
"b" : {
"c" : {
"d" : {
"id" : 1234
}
}
}
}
}
(脚注として、 道 タプルを使用してフォールドを実行し、適切な静的型で終了することもできますが、それはこの場合にほぼ確実に望んでいることではありません。)