Я пытаюсь прочитать электронную почту из файла json в swift (2.2), который:

 { "employees" : [
  {
    "name": "sudhanshu",
    "email": "sudhanshu.bharti@digitalavenues.com",
    "password": "password"
    "profilePic": ""
 },
 {
    "name": "prokriti",
    "email": "prokriti.roy@digitalavenues.com",
    "password": "password@123",
    "profilePic": ""
  }
]}

Но я получаю сообщение об ошибке «Error Domain = NSCocoaErrorDomain Code = 3840» Неэкранированный управляющий символ вокруг символа 128. «UserInfo = {NSDebugDescription = Неэкранированный управляющий символ вокруг символа 128.}» Я видел более ранние сообщения, но не могу найти, где именно проблема? ?

if let path = NSBundle.mainBundle().pathForResource("Employees", ofType: "json") {
        if let data = NSData(contentsOfFile: path) {
            do {
                let jsonResult: NSDictionary = try NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers) as! NSDictionary

                if let error = jsonResult["error"] {
                    print("Error is: \(error)")
                } else {
                    if let person = jsonResult["email"] {
                        print(person) // dictionary[@"quotables"]
                    }
                }

            } catch let error as NSError {
             print("Error is: \(error)")
            }

        }
    }

Заранее спасибо!

0
S. Bharti 27 Апр 2016 в 14:41

2 ответа

Лучший ответ

Вы пытаетесь напрямую получить доступ к электронному ключу из словаря. в то время как вам нужно сначала получить доступ к массиву из ключа «сотрудники», а затем вам нужно получить значение из ключа «электронная почта».

if let path = NSBundle.mainBundle().pathForResource("Employees", ofType: "json") {
if let data = NSData(contentsOfFile: path) {
    do {
        let jsonResult: NSDictionary = try NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers) as! NSDictionary

        if let error = jsonResult["error"] {
            print("Error is: \(error)")
        } else {
            let person = jsonResult["employees"] as! NSArray
            for i in 0..<person.count
            {
                let dict = person.objectAtIndex(i) as! NSDictionary
                let strEmail = dict["email"] as! String
                print(strEmail)
            }
        }

    } catch let error as NSError {
        print("Error is: \(error)")
    }

}
0
S. Bharti 28 Апр 2016 в 08:51

"пароль": "пароль"

Должно быть

"пароль": "пароль"

У вас недопустимый символ вместо ".

Обновить

Теперь, когда вы исправили свой недопустимый символ, вы можете получить доступ к своим данным. Но вы пытаетесь преобразовать в NSDictionary что-то, что на самом деле является массивом, если я верю отрывку JSON, который вы нам показали.

Поэтому вместо этого вы должны сделать что-то подобное в своем do:

if let jsonResult = try NSJSONSerialization.JSONObjectWithData(data, options: []) as? [[String: String]] {
    for jsonDictionary in jsonResult {
        if let person = jsonDictionary["email"] {
            print(person)
        }
    }
}

Обновить и исправить

if let jsonResult = try NSJSONSerialization.JSONObjectWithData(data, options: []) as? [String: AnyObject] {
    if let employees = jsonResult["Employees"] as? [[String:String]] {
        for employee in employees {
            if let person = employee["email"] {
                print(person)
            }
        }
    }
}
5
Eric Aya 27 Апр 2016 в 12:24