scala - смешивание json4s и спрей-анализаторов json - PullRequest
0 голосов
/ 15 марта 2019

Я перевожу геотреллис в большой существующий проект Scala. Я буду использовать это для (среди прочего) обработки GeoJson. Геотреллис зависит от spray.

Существующий проект использует json4s для парсеров json, встроенных в методы сопутствующих объектов .apply() для некоторых тяжелых структур данных.

Таким образом, geotrellis / spray будет обрабатывать GeoJson / Features ... но я бы хотел использовать существующие парсеры на основе json4s для анализа properties в структурах данных.

Минимальный пример ... изменен отсюда: https://geotrellis.readthedocs.io/en/latest/guide/vectors.html#deserializing-from-geojson

Это отлично работает (все геотреллы / спрей) ...

import geotrellis.vector.{Feature, Point, PointFeature, Polygon, PolygonFeature}
import geotrellis.vector.io._
import geotrellis.vector.io.json._
import spray.json.DefaultJsonProtocol._

// !!!  REPLACE THIS PART (MyData & md)  !!!
// data structure and parser for "properties" => MyData
case class MyData(d1: Int, d2: String, d3: Option[Double]=None)
implicit val md: spray.json.RootJsonFormat[MyData] = jsonFormat3(MyData)

// json as string
val json: String = 
  """{"type":"Feature","geometry":{"type":"Point","coordinates":[0.0,0.0]},"properties":{"d1":123,"d2":"xyz"}}"""

// parsed
val point_feature = json.parseGeoJson[Feature[Point, MyData]]

Но ... теперь я хочу отбросить MyData и md (классы case не будут работать для меня) и найти способ использовать мои существующие структуры данных и парсеры. Для этого игрушечного примера, это имитирует то, с чем я работаю ...

import org.json4s.JsonDSL._
import org.json4s.jackson.JsonMethods.{render,compact,pretty}

import org.json4s.DefaultFormats
import org.json4s.jackson.JsonMethods._
import org.json4s.{JValue, JObject, JInt, JDouble, JString} 

import scala.util.Try

class MyData2(val d1: Int, val d2: String, val d3: Option[Double]) {
  def json: JObject = (
    ("d1" -> d1) ~
    ("d2" -> d2) ~
    ("d3" -> d3)
  )
}

object MyData2 {
  // json => MyData2
  def apply(json: String): MyData3 = {
    implicit val formats = DefaultFormats
    val parsedJson: JValue = parse(json)
    val d1: Int = (parsedJson \ "d1").asInstanceOf[JInt].num.toInt
    val d2: String = (parsedJson \ "d2").asInstanceOf[JString].s
    val d3: Option[Double] = Try { (parsedJson \ "d3").asInstanceOf[JDouble].num.toDouble }.toOption
    new MyData2(d1, d2, d3)
  }
}

Мой вопрос ...

Как я могу использовать мои существующие MyData2.apply() для анализа properties в json?

Я пошел и посмотрел здесь: https://github.com/spray/spray-json/blob/master/src/main/scala/spray/json/StandardFormats.scala

Я подумал, может быть, я мог бы расширить RootJsonFormat и попытаться преобразовать мои json4s значения в spray в методах read и write ... но я должен подумать, что есть более простой способ.

Заранее спасибо.

...