0
私はスカンタとプレイフレームワークでjsonの文字列を解析しようとしていますが、私はまだdocを読みましたが、まだ私は立ち往生しています。 私が得た:地図を含むスカラのjsonを構文解析する
val jsonStr = """{
| "metric": "java.lang.Memory.HeapMemoryUsage.committed",
| "tags": {
| "instanceId": "ubuntu",
| "runId": "B_name_of_the_app-c4m8_0_2016-01-01_23-31-34"
| },
| "aggregateTags": [],
| "dps": {
| "1455711498": 8.71890944E8,
| "1455711558": 9.10688256E8,
| "1455711618": 9.24319744E8,
| "1455711678": 8.47773696E8,
| "1455711738": 9.35329792E8,
| "1455711798": 9.53679872E8,
| "1455714981": 1.983905792E9,
| "1455715041": 2.054684672E9,
| "1455715101": 2.05520896E9
| }
| }""".stripMargin
playframeworkドキュメントによると、私はこの事を解析するためのクラスを作成しました:
//のScalaファイルの先頭
import play.api.libs.json.{JsPath, Json, Reads}
import play.api.libs.functional.syntax._
case class Metric(metricName: String, tags: Tags, aggregateTags: Option[Seq[String]], dps: Seq[Map[String,Double]])
object Metric{
implicit val metricReads: Reads[Metric] = (
(JsPath \ "metric").read[String] and
(JsPath \ "tags").read[Tags] and
(JsPath \ "aggreagateTags").readNullable[Seq[String]] and
(JsPath \ "dps").read[Seq[Map[String,Double]]] //this one is tricky
)(Metric.apply _)
}
case class Tags(instanceId:String, runId: String)
object Tags{
implicit val tagsReads: Reads[Tags] = (
(JsPath \ "instanceId").read[String] and (JsPath \ "runId").read[String]
)(Tags.apply _)
}
Json.parse(jsonStr).validate[Metric]
// Scalaのファイル残念ながら の終わり検証結果:
res0: play.api.libs.json.JsResult[Metric] = JsError(List((//dps,List(ValidationError(List(error.expected.jsarray),WrappedArray())))))
私はこの問題を解決する方法も分からず、別のクラスとしてdps 'を解析しようとしましたが、うまくいきませんでした。