在Scala中基于模式生成随机/样例json



我需要生成一些随机json样本,符合一个模式动态。这意味着输入将是一个模式(例如json-schema),输出将是一个遵循它的json。

我在找指针。有什么建议吗?

这不是完整的解决方案,但您可以从这里获得。

假设我们有我们想要生成的域对象:

case class Dummy1(foo: String)
case class Dummy11(foo: Dummy1)

如果我们这样做:


object O {
implicit def stringR: Random[String] = new Random[String] {
override def generate(): String = "s"
}
implicit def intR: Random[Int] = new Random[Int] {
override def generate(): Int = 1
}
implicit def tupleR[T1: Random, T2: Random]: Random[(T1, T2)] = new Random[(T1, T2)] {
override def generate(): (T1, T2) = {
val t1: T1 = G.random[T1]()
val t2: T2 = G.random[T2]()
(t1, t2)
}
}
}
object G {
def random[R: Random](): R = {
implicitly[Random[R]].generate()
}
}
那么我们将能够生成一些基本值:
import O._
val s: String = G.random[String]()
val i: Int = G.random[Int]()
val t: (Int, String) = G.random[(Int, String)]()
println("s=" + s)
println("i=" + i)
println("t=" + t)
现在要跳转到自定义类型,我们需要添加
def randomX[R: Random, T](f: R=>T): Random[T] = {
val value: Random[R] = implicitly[Random[R]]
new Random[T] {
override def generate(): T = f.apply(value.generate())
}
}

到我们的G对象。

现在我们可以

import O._
val d1: Dummy1 = G.randomX(Dummy1.apply).generate()
println("d1=" + d1)

和一些额外的努力甚至

import O._
implicit val d1Gen: Random[Dummy1] = G.randomX(Dummy1.apply)
val d11: Dummy11 = G.randomX(Dummy11.apply).generate()
println("d11=" + d11)

现在您需要将其扩展到您拥有的所有原语,添加具有多个字段的随机和支持类的实际实现,然后准备好了。

你甚至可以用它创建一个奇特的库。

最新更新