有几种方法可以做到这一点,尽管它们都不被 Finch 认为是惯用的。在 an 中接受任意 JSON 对象的或多或少安全的方法Endpoint
是下拉到通过您正在使用的 JSON 库公开的 JSON AST API。对于 json4s,它将是org.json4s.JsonAST.JValue
.
scala> import io.finch._, io.finch.json4s._, org.json4s._
scala> implicit val formats: Formats = DefaultFormats
formats: org.json4s.Formats = org.json4s.DefaultFormats$@5ee387bc
scala> val e = jsonBody[JsonAST.JValue]
e: io.finch.Endpoint[org.json4s.JsonAST.JValue] = body
scala> e(Input.post("/").withBody[Application.Json](Map("foo" -> 1, "bar" -> "baz"))).awaitValueUnsafe()
res2: Option[org.json4s.JsonAST.JValue] = Some(JObject(List((foo,JInt(1)), (bar,JString(baz)))))
这将为您提供一个JsonAST.JValue
您需要手动操作的实例(我假设为此公开了一个模式匹配 API)。
另一种(也是更危险的)解决方案是要求 Finch/JSON4S 将 JSON 对象解码为Map[String, Any]
. 但是,这仅在您不希望您的客户端将 JSON 数组作为顶级实体发送时才有效。
scala> import io.finch._, io.finch.json4s._, org.json4s._
scala> implicit val formats: Formats = DefaultFormats
formats: org.json4s.Formats = org.json4s.DefaultFormats$@5ee387bc
scala> val b = jsonBody[Map[String, Any]]
b: io.finch.Endpoint[Map[String,Any]] = body
scala> b(Input.post("/").withBody[Application.Json](Map("foo" -> 1, "bar" -> "baz"))).awaitValueUnsafe()
res1: Option[Map[String,Any]] = Some(Map(foo -> 1, bar -> baz))