2016-05-21 7 views
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 'を解析しようとしましたが、うまくいきませんでした。

答えて

2

あなたのJSONに(JsPath \ "dps").read[Seq[Map[String,Double]]]が、dpsを持ってはSeqではなく、単一のエントリ - (JsPath \ "dps").read[Map[String,Double]]に読者の一部を変更するには、問題を解決します。

関連する問題