首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用play-json转换器创建并填充JsArray

使用play-json转换器创建并填充JsArray
EN

Stack Overflow用户
提问于 2017-02-17 05:01:17
回答 1查看 860关注 0票数 2

使用Play/Scala,我尝试转换这个json:

代码语言:javascript
复制
val json = Json.parse(""" 
{
  "name": "John Doe",
  "location": { 
    "lon": 48.858596, 
    "lat": 2.294481 
  }
} 
""")

这样的结果:

代码语言:javascript
复制
val result = Json.parse(""" 
{ 
  "name": "John Doe", 
  "location": { 
    "type": "Point", 
    "coordinates": [48.858596, 2.294481] 
  }
} 
""")

你知道怎么施展魔法吗?这是我尝试过的:

代码语言:javascript
复制
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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-02-18 17:55:29

假设导入:

代码语言:javascript
复制
import play.api.libs.json._

您可以定义一个表示location值的Location

代码语言:javascript
复制
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]
}

现在你可以这样做:

代码语言:javascript
复制
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]},)

现在,您可以将其插入到转换中,例如:

代码语言:javascript
复制
(__ \ 'location).json.update(of[LonLat].map(_.toPoint))

但是在这个转换中会留下latlon字段。因此,删除它们:

代码语言:javascript
复制
(__ \ 'location).json.update(of[LonLat].map(_.toPoint)) andThen
  (__ \ 'location \ 'lat).json.prune andThen
  (__ \ 'location \ 'lon).json.prune

在我看来,这是不可能简化的,因为update是这类操作中唯一的操作-这恰好是一个深度合并。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42284521

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档