0

我正在创建一个需要 Json 的 Finch 端点。

URL - LogBundles/Long JSON 消息/进程

我正在使用 json4s 库进行 Json 解析

如何将正文指定为 json 类型或者如何在 LogBundles 和 Process 之间传递 Json 值?

我不能做 body.as[case class] 因为我不知道 Json 的确切结构。我只会在解析时寻找一个特定的键。

代码

val bundleProcessEndpoint: Endpoint[String] = put("LogBundles" :: body :: "Process" ) { id =>
                 val jsonBody = parse(id)}

错误

找不到参数 d 的隐式值:io.finch.Decode.Aux[A,CT] [error] val bundleProcessEndpoint: Endpoint[String] = put("LogBundles" :: body :: "Process" ) { id:JsonInput =>

4

1 回答 1

1

有几种方法可以做到这一点,尽管它们都不被 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))
于 2017-03-08T06:02:35.790 回答