2017-03-08 9 views
0

Jsonが必要なFinchエンドポイントを作成しています。要求パラメータをJsonタイプとして指定する方法

URL - LogBundles /ロングJSONメッセージ/プロセス

私は

どのように私はタイプJSONとして体を指定しないまたはどのように私はLogBundlesとプロセス間のJSON値を渡すかを解析JSONためjson4sライブラリを使用しています?

私はJsonの正確な構造を知っていないので、body.as [case class]はできません。 私は、解析中に特定のキーを探し出すだけです。

コード

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

ERROR

は、パラメータdの暗黙的な値を見つけることができませんでした:io.finch.Decode.Aux [A、CT] [エラー]ヴァルbundleProcessEndpoint:エンドポイント[String] = put( "LogBundles" :: body :: "Process"){id:JsonInput =>

答えて

1

これはいくつかの方法がありますが、いずれもiとはみなされませんフィンチのためのdiomatic。 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 = [email protected] 

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にMap[String, Any]というJSONオブジェクトのデコードを依頼するという方法があります(さらに危険です)。ただし、クライアントがJSON配列を最上位エンティティとして送信することを期待していない場合にのみ機能します。

scala> import io.finch._, io.finch.json4s._, org.json4s._ 

scala> implicit val formats: Formats = DefaultFormats 
formats: org.json4s.Formats = [email protected] 

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)) 
+0

私が間違っている場合は、私を訂正してください。しかし、私の質問は、ユーザーが送信したPUT要求のエンドポイントからJsonペイロードを消費する方法でした。 WithBodyユーザーが送信したペイロードをオーバーライドします。 –

+0

これらの2つの例の最後の行は、エンドポイントが特定の入力に対して何を返すかを示すためのものです。あなたはあなたのアプリケーションでそれを必要としません。すべての混乱を解消するのに役立つ[ユーザーガイド](https://finagle.github.io/finch/user-guide.html)をご覧になることをお勧めします。 –

関連する問題