2017-02-16 10 views
1

でJsArrayを作成し、塗りつぶし、私はこのJSONを変換しようとは再生/スカラ座で遊ぶ-JSONトランス

val result = Json.parse(""" 
{ 
    "name": "John Doe", 
    "location": { 
    "type": "Point", 
    "coordinates": [48.858596, 2.294481] 
    } 
} 
""") 

魔法を適用する方法任意のアイデア?ここに私が試したものです:

import play.api.libs.json._ 
import play.api.libs.json.Reads._ 
import play.api.libs.functional.syntax._ 

val transformer = { 
    val locationField = __ \ "location" 
    val lon = (locationField \ "lon").json.pick 
    val lat = (locationField \ "lat").json.pick 

    __.json.update((
     (locationField \ "type").json.put(JsString("Point")) and 
     (locationField \ "coordinates").json.put(JsArray())).reduce 
     andThen 
     (locationField \ "coordinates").json.update(of[JsArray].map { // How to add lon/lat into JsArray????? 
      case JsArray(arr) => JsArray(arr :+ JsNumber(3L)) 
      } 
     ) 
     andThen (
     (locationField \ "lon").json.prune and 
     (locationField \ "lat").json.prune).reduce 
    ) 
    } 

json.transform(transformer) 

はここにコードを取得する:https://gist.github.com/chrissom/20c5aa254210d7c32f53479df6a66f68

答えて

0

は、インポートと仮定すると:

import play.api.libs.json._ 

あなたはlocation値を表すことになりLocationを定義することができます。

case class Location(lon: Double, lat: Double) { 
    def toPoint: JsObject = { 
    Json.obj(
     "type" -> "Point", 
     "coordinates" -> Json.arr(lon, lat) 
    ) 
    } 
} 

object Location { 
    implicit val reads: Reads[Location] = Json.reads[LonLat] 
} 

今あなたができる:

val locationJson = Json.parse("""{"lon": 48.858596, "lat": 2.294481}""") 

locationJson.transform(of[LonLat].map(_.toPoint)) 
// Output: 
// JsSuccess({"type":"Point","coordinates":[48.858596,2.294481]},) 

今、あなたのような変換にこれをプラグインすることができます

(__ \ 'location).json.update(of[LonLat].map(_.toPoint)) 

しかし、あなたがlatlonフィールドで残されますこの変換。だから、それらを削除します。

(__ \ 'location).json.update(of[LonLat].map(_.toPoint)) andThen 
    (__ \ 'location \ 'lat).json.prune andThen 
    (__ \ 'location \ 'lon).json.prune 

updateは、その種の操作のみであるとして、これを簡略化することが可能ではないように私には見える - ディープマージであることを起こります。

関連する問題