Guys, something really strange is happening with a basic JSON extract trying to get a zip code value from dispatch's retrieved JSON. I can see that JValue is printing out fine but extract is throwing an exception. I was following the example in lift cookbook
http://cookbook.liftweb.net/#FetchURLs
object asJson extends (client.Response => JValue) {
def apply(r: client.Response) = JsonParser.parse(r.getResponseBody)
}
val json: Promise[JValue] = Http(url("
http://api.ipinfodb.com/v3/" + api.toString + "/?key=" + key + "&ip=" + ipAddress + "&format=" + "json") > asJson)
println(json()) gives this:
JObject(List(JField(statusCode,JString(OK)), JField(statusMessage,JString()), JField(ipAddress,JString(96.56.218.0)), JField(countryCode,JString(US)), J
Field(countryName,JString(UNITED STATES)), JField(regionName,JString(NEW YORK)), JField(cityName,JString(HICKSVILLE)), JField(zipCode,JString(11801)), JField(latitude,JString(4
0.7641)), JField(longitude,JString(-73.519)), JField(timeZone,JString(-04:00))))
case class ZipCode(zipCode: String)
implicit val formats = DefaultFormats
val v = json.map(_.extract[ZipCode])() produces the following stacktrace
net.liftweb.json.MappingException: No usable value for $outer
No usable value for key
Did not find value which can be converted into java.lang.String
at net.liftweb.json.Meta$.fail(Meta.scala:191)
at net.liftweb.json.Extraction$.mkValue$1(Extraction.scala:357)
at net.liftweb.json.Extraction$.net$liftweb$json$Extraction$$build$1(Extraction.scala:317)
at net.liftweb.json.Extraction$$anonfun$13.apply(Extraction.scala:253)
at net.liftweb.json.Extraction$$anonfun$13.apply(Extraction.scala:253)
at scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:244)
at scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:244)
at scala.collection.immutable.List.foreach(List.scala:309)
at scala.collection.TraversableLike$class.map(TraversableLike.scala:244)
at scala.collection.AbstractTraversable.map(Traversable.scala:105)
at net.liftweb.json.Extraction$.instantiate$1(Extraction.scala:253)
at net.liftweb.json.Extraction$.newInstance$1(Extraction.scala:286)
at net.liftweb.json.Extraction$.net$liftweb$json$Extraction$$build$1(Extraction.scala:315)
at net.liftweb.json.Extraction$.net$liftweb$json$Extraction$$extract0(Extraction.scala:366)
at net.liftweb.json.Extraction$.net$liftweb$json$Extraction$$extract0(Extraction.scala:199)
at net.liftweb.json.Extraction$.extract(Extraction.scala:43)
at net.liftweb.json.JsonAST$JValue.extract(JsonAST.scala:300)
at com.uinsport.model.GeoIP$$anonfun$1.apply(GeoIP.scala:52)
at com.uinsport.model.GeoIP$$anonfun$1.apply(GeoIP.scala:52)
at dispatch.Promise$$anon$1.claim(promise.scala:87)
at dispatch.Promise$$anonfun$result$1.apply(promise.scala:64)
at scala.util.control.Exception$Catch$$anonfun$either$1.apply(Exception.scala:124)
at scala.util.control.Exception$Catch$$anonfun$either$1.apply(Exception.scala:124)
at scala.util.control.Exception$Catch.apply(Exception.scala:102)
at scala.util.control.Exception$Catch.either(Exception.scala:124)
at dispatch.Promise$class.result(promise.scala:64)