/ /シーケンスからのScala動的タプル型の構築-Scala、Types

シーケンスからのスカラ動的タプル型構造 - スカラ、型

私はを使用していくつかの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
}
}
}
}
}

(脚注として、 タプルを使用してフォールドを実行し、適切な静的型で終了することもできますが、それはこの場合にほぼ確実に望んでいることではありません。)