Cannot convert jsonArray element to integer

假如想象 提交于 2019-12-13 08:38:21

问题


do{
    let resultJSON = try NSJSONSerialization.JSONObjectWithData(data!, options: NSJSONReadingOptions())
    let arrayJSON = resultJSON as! NSArray

    let success:NSInteger = arrayJSON["success"] as! NSInteger

    if (success == 1 ) ....

json data is the response from the server, i am trying to convert it to integer but i get the conversation error.


回答1:


This is a working exmaple (tested on my machine)

let task = session.dataTaskWithRequest(request, completionHandler: {(data, response, error) in

            if let error = error {
                print(error)
            }
            if let data = data{
                print("data =\(data)")
                do{
                let resultJSON = try NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions())
                let resultDictionary = resultJSON as? NSDictionary

                    let success = resultDictionary!["success"]!
                    let successInteger = success as! Int
                    print("success = \(success)")
                    if successInteger == 1 {
                        print("yes")
                    }else{
                        print("no")
                    }
                }catch _{
                    print("Received not-well-formatted JSON")
            }

            }
            if let response = response {
                print("url = \(response.URL!)")
                print("response = \(response)")
                let httpResponse = response as! NSHTTPURLResponse
                print("response code = \(httpResponse.statusCode)")
            }



        })
        task.resume()

where the response is:

{ "error_message" : "No User", "success" : 0}

Note

you said that your server responnes as:

{ "error_message" = "No User"; success = 0; } 

and this is not a valid json, you should correct it to match the json that i gave to you




回答2:


You're casting resultJSON as an NSArray but then you try to use it as a dictionary by subscripting "success".

If the response is a dictionary, then cast the result as a dictionary:

let result = resultJSON as! NSDictionary
let success = result["success"] as! NSInteger

If the response is an array of dictionaries, then first select one of the items before subscripting.

let arrayJSON = resultJSON as! NSArray
let success = arrayJSON[0]["success"] as! NSInteger

Note: when possible, prefer using Swift's typed arrays an dictionaries rather than Foundation's NSArray and NSDictionary. Also you should avoid force casting with !, it's better to unwrap optionals safely with if let ... = ... as? ... or any other mechanism.

Update

Here's an example:

do {
    let resultJSON = try NSJSONSerialization.JSONObjectWithData(data!, options: NSJSONReadingOptions())

    var success = 0

    if let dictJSON = resultJSON as? [String:AnyObject] {
        if let successInteger = dictJSON["success"] as? Int {
            success = successInteger
        } else {
            print("no 'success' key in the dictionary, or 'success' was not compatible with Int")
        }
    } else {
        print("unknown JSON problem")
    }

    if success == 1 {
        // yay!
    } else {
        // nope
    }

In this example I'm using a Swift dictionary [String:AnyObject] instead of an NSDictionary, and I'm using a Swift integer Int instead of Foundation's NSInteger. I'm also typecasting with if let instead of forcing.



来源:https://stackoverflow.com/questions/32953501/cannot-convert-jsonarray-element-to-integer

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!