Другой пример:
func getJason(url: NSURL, completionHandler: (String?, NSError?) -> Void ) -> NSURLSessionTask {
var finalData: String!
let task = NSURLSession.sharedSession().dataTaskWithURL(url) { (data, response, error) -> Void in
if error != nil{
completionHandler(nil, error)
return
}
else{
if let urlContent = data{
do{
let jsonData = try NSJSONSerialization.JSONObjectWithData(urlContent, options: NSJSONReadingOptions.MutableContainers)
if let ip = jsonData["ip"]{
finalData = ip as? String
completionHandler(finalData, nil)
return
}
}catch{
print("EMPTY")
}
}
}
}
task.resume()
return task
}
Затем я назвал его в viewDidLoad
getJason(url) { (ipAddress, error) -> Void in
if error != nil{
print(error)
}
else{
if let ip = ipAddress{ //To get rid of optional
self.ipLabelDisplay.text = "Your Ip Address is: \(ip)"
}
}
}
Абстрактные типы ошибок
либо должны быть сопоставлены конкретным типам, имеют пользовательский десериализатор, либо создаются с дополнительной информацией о типе
blockquote>, что означает Джексон не может проанализировать объект на основе интерфейса
DemographicRequest
. Вы должны предоставить конкретные классыNameRequest
,AddressRequest
. Единственное, о чем можно подумать, если использоватьRequestStreamHandler
и выполнять десериализацию «вручную». Но я признаю, что это не особенно элегантно. Например,public class LambdaFunctionHandler implements RequestStreamHandler { @Override public void handler(InputStream inputStream, OutputStream outputStream, Context context) throws IOException, IOException { context.getLogger().log("Input: " + inputStream); final ObjectMapper objectMapper = new ObjectMapper(); try { Object input = objectMapper.readValue(inputStream, NameRequest.class); context.getLogger().log("Name request"); // name specific logic and update in db } catch (JsonMappingException e) { // } try { Object input = objectMapper.readValue(inputStream, AddressRequest.class); context.getLogger().log("Address Request"); //address specific logic and update in db } catch (JsonMappingException e) { // } // TODO: implement your handler outputStream.write("Hello from Lambda!".getBytes()); outputStream.close(); } }
Лучшим подходом, вероятно, будет предоставление отдельного обработчика для каждого типа.