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