Использование спрей-json (поскольку я использую распылитель-клиент), чтобы получить объект широты, долготы из API карт Google. Мне нужно создать всю структуру ответа:unmarshall inested json in spray-json
case class AddrComponent(long_name: String, short_name: String, types: List[String])
case class Location(lat: Double, lng: Double)
case class ViewPort(northeast: Location, southwest: Location)
case class Geometry(location: Location, location_type: String, viewport: ViewPort)
case class EachResult(address_components: List[AddrComponent],
formatted_address: String,
geometry: Geometry,
types: List[String])
case class GoogleApiResult[T](status: String, results: List[T])
object AddressProtocol extends DefaultJsonProtocol {
implicit val addrFormat = jsonFormat3(AddrComponent)
implicit val locFormat = jsonFormat2(Location)
implicit val viewPortFormat = jsonFormat2(ViewPort)
implicit val geomFormat = jsonFormat3(Geometry)
implicit val eachResFormat = jsonFormat4(EachResult)
implicit def GoogleApiFormat[T: JsonFormat] = jsonFormat2(GoogleApiResult.apply[T])
}
import AddressProtocol._
Есть ли способ получить только Location
от json в ответе и избежать всего этого gumph?
код спрей-клиент:
implicit val system = ActorSystem("test-system")
import system.dispatcher
private val pipeline = sendReceive ~> unmarshal[GoogleApiResult[EachResult]]
def getPostcode(postcode: String): Point = {
val url = s"http://maps.googleapis.com/maps/api/geocode/json?address=$postcode,+UK&sensor=true"
val future = pipeline(Get(url))
val result = Await.result(future, 10 seconds)
result.results.size match {
case 0 => throw new PostcodeNotFoundException(postcode)
case x if x > 1 => throw new MultipleResultsException(postcode)
case _ => {
val location = result.results(0).geometry.location
new Point(location.lng, location.lat)
}
}
}
Или же, как я могу использовать джексон с распылением клиента?
Вы можете попробовать https: // github.com/jrudolph/json-lenses/, который позволяет вам легко извлекать данные из JSON ast. – jrudolph
Awesome, немного поиграл, но теперь он отлично выглядит. Разве это будет слито с брызгами? Должен быть!!! – shmish111
Слияние с распылителем - это план, но мы в настоящее время не в состоянии сделать ход. – jrudolph