scala - 基于 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)
现在您需要将它扩展到您拥有的所有原语,添加具有超过 1 个字段的随机和支持类的实际实现,然后您就可以开始了。
你甚至可以用它制作一些花哨的库。
推荐阅读
- java - 如何调用处理 APIGatewayProxyRequestEvent 的 AWS Lambda 函数?
- java - 如何根据用户输入设置多个空格?
- postgresql - 在 Postgresql 中拥有 PUBLIC 和 PRIVATE FUNCTIONS 的惯用方式是什么?
- storybook - 如何更改故事书中的特定元素样式?
- google-cloud-platform - Google Cloud Platform - API 网关无法 PUT/DELETE 错误
- reactjs - 更改 MUI 评级中的星级数量
- python - 根据具有多个重复名称的列表位置重命名列名索引
- javascript - 使用 Google API 创建电子表格时在工作表上设置权限
- vbscript - 通用脚本无法重新启动 tomcat
- julia - 使用 `Base.@kwdef` 广播结构创建