JsonMappingException при использовании Inheritance в запросе json

Другой пример:

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)"

            }

        }
    }
0
задан user12 13 July 2018 в 15:12
поделиться

1 ответ

Абстрактные типы ошибок

либо должны быть сопоставлены конкретным типам, имеют пользовательский десериализатор, либо создаются с дополнительной информацией о типе

, что означает Джексон не может проанализировать объект на основе интерфейса 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();
    }

}

Лучшим подходом, вероятно, будет предоставление отдельного обработчика для каждого типа.

0
ответ дан LazerBass 17 August 2018 в 12:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: