2016-06-01 10 views
0

私はこのようなスカラ座でのJSONファイルを抽出します:スカラ読むJSONファイル

val json: JsValue = Json.parse(""" 
{ 
"Received":"2015-12-29T00:00:00.000Z", 
"Created":"2015-12-29T00:00:00.000Z", 
"Location":{ 
    "Created":"2015-12-29T00:00:00.000Z", 
    "Coordinate":{ 
     "Latitude":45.607807, 
     "Longitude":-5.712018}, 
     }, 
"Infos":[], 
"DigitalInputs":[{ 
     "TypeId":145, 
     "Value":false, 
     "Index":23 
     }], 
     } 
           """) 

をして、これは私のScalaのコードです:

import org.apache.flink.api.scala._ 
import play.api.libs.json._ 

case class DInputs(
        TypeId: Option[Int], 
        Value: Option[Boolean], 
        Index: Option[Int] 
       ) 

case class myjson (
        Received: String, 
        Created: String, 
        Location: Option[String], 
        Infos: Option[String], 
        DigitalInputs: Option[List[DInputs]], 
       ) 

implicit val DInputsRead: Reads[Option[DInputs]] = (
    (__ \ "TypeId").readNullable[Int] andThen 
    (__ \ "Value").readNullable[Boolean] andThen 
    (__ \ "Index").readNullable[Int] 
)(DInputs.apply _) 

case Some(json.DInputsRead) => println(json.DInputsRead) 

私のコードのエラー:Expression of type Reads[Option[Int]] doesn´t conform to expected type Reads[Option[DInputs]]

私は初心者で、どこに問題があるのか​​理解していないので、これがjsonファイルを読む最良の方法なのかどうかは分かりませんので、どんな助けもありがたいです。ありがとう。

答えて

0

あなたの入力し、あなたのソリューションを持ついくつかの問題があります。

  1. があなたの入力JSONは無効である:それは2つの場所に過度にカンマが含まれています。右DigitalInputsオブジェクト後Location対象とした直後。あなたはJSONs hereを検証できます。
  2. Json.readsメソッドを使用すると、Readsインスタンスを大幅に短縮できます。
  3. myjsonクラスのReadsインスタンスがありません。
  4. Locationオブジェクトのケースクラスがありません。ここで

は、通常のScalaのケースクラスにご入力JSONをパースの完全な例です:

import play.api.libs.json.Json 

    case class MyJson(Received: String, 
        Created: String, 
        Location: Option[Location], 
        Infos: Option[List[String]], 
        DigitalInputs: Option[List[DigitalInputs]]) 

    case class Location(Created: String, 
         Coordinate: Coordinate) 

    case class Coordinate(Latitude: Double, 
         Longitude: Double) 

    case class DigitalInputs(TypeId: Option[Int], 
          Value: Option[Boolean], 
          Index: Option[Int]) 

    implicit val digitalInputsReads = Json.reads[DigitalInputs] 
    implicit val coordinateReads = Json.reads[Coordinate] 
    implicit val locationReads = Json.reads[Location] 
    implicit val myJsonReads = Json.reads[MyJson] 

    val inputJson = Json.parse(
    """ 
     |{ 
     | "Received":"2015-12-29T00:00:00.000Z", 
     | "Created":"2015-12-29T00:00:00.000Z", 
     | "Location":{ 
     | "Created":"2015-12-29T00:00:00.000Z", 
     | "Coordinate":{ 
     |  "Latitude":45.607807, 
     |  "Longitude":-5.712018 
     | } 
     | }, 
     | "Infos":[ 
     | 
     | ], 
     | "DigitalInputs":[ 
     | { 
     |  "TypeId":145, 
     |  "Value":false, 
     |  "Index":23 
     | } 
     | ] 
     |} 
    """.stripMargin 
) 

    val myJsonInstance: MyJson = inputJson.as[MyJson] 
    val longitude: Option[Double] = myJsonInstance.Location.map(_.Coordinate.Longitude) // Some(-5.712018) 
    val typeId: Option[Int] = myJsonInstance.DigitalInputs.flatMap(_.headOption.flatMap(_.TypeId)) // Some(145) 
+0

がよさそうだ、今私はあなたを考える 'and'とオペレータ – jag

+0

でシンボルを解決できません持っていますここにインポートがありません: 'import play.api.libs.functional.syntax._' –

+0

はい、これが問題でした。ありがとうPawel – jag