如何将请求参数指定为Json类型

时间:2017-03-08 03:37:19

标签: scala finagle finch twitter-finagle

我正在创建一个需要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 =>

1 个答案:

答案 0 :(得分:1)

有几种方法可以做到这一点,虽然它们都不被认为是Finch的惯用语。在Endpoint中接受任意JSON对象的或多或少的安全方法是下拉到通过您正在使用的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))