我需要生成一些随机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)
现在您需要将其扩展到您拥有的所有原语,添加具有多个字段的随机和支持类的实际实现,然后准备好了。
你甚至可以用它创建一个奇特的库。