Я перевожу геотреллис в большой существующий проект 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
... но я должен подумать, что есть более простой способ.
Заранее спасибо.