2016-09-29 4 views
0

아래 JSON 구문 분석을 시도하고 있습니다. 아래의 JSON 파일은 JSON 파일입니다. 그리고 제가 선언 한 클래스의 배열에 들어가보십시오. 그러나 오류 발생 : 치명적인 오류 : NSArray 요소가 Swift Array 요소 유형과 일치하지 못했습니다.스위프트 3 : NSArray 요소가 스위프트 배열 요소 유형과 일치하지 못했습니다.

{ 
"Headers": [ 
      { 
      "headerName": "Home", 
      "sortByNo" : 1, 
      "headerImageName": "header0", 
      "viewCotrollerName": "InitialViewController" 

      }, 
      { 
      "headerName": "About", 
      "sortByNo" : 2, 
      "headerImageName": "header1", 
      "viewCotrollerName": "" 
      }, 
      { 
      "headerName": "Timing", 
      "sortByNo" : 3, 
      "headerImageName": "header3", 
      "viewCotrollerName": "TimingViewController" 
      } 
     ] 
} 


    // Class Type 
class JsonObjectClass { 

var headerName = "" 
var sortByNo = "" 
var headerImageName = "" 
var viewControllerName = "" 

} 

var array = [JsonObjectClass]() // my array of class type 

//JSON Parsing Code 
func parseLocalFile() { 

    let url = Bundle.main.url(forResource: "HeaderFileD", withExtension: "json") 
    let data = NSData(contentsOf: url!) 

    do { 
     let jsonData = try JSONSerialization.jsonObject(with: data! as Data, options: .mutableContainers) as! NSDictionary 

     array = jsonData.object(forKey: "Headers") as! [JsonObjectClass] 

    // I am getting error here "fatal error: NSArray element failed to match the Swift Array Element type"   
     for arr in array { 
      print(arr) 

     } 

    } catch { 

    } 
} 

답변

0

사용자 지정 클래스에 배열이나 사전을 직접 할당 할 수 없습니다. 클래스의 인스턴스를 만들어 배열을 매핑해야합니다.

멤버 - 와이즈 이니셜 라이저를 얻기 위해 클래스를 struct로 변경했습니다. 그런데, 키 sortByNo 값은 Int

struct JsonObjectClass { 
    var headerName = "" 
    var sortByNo = 0 
    var headerImageName = "" 
    var viewControllerName = "" 
} 

var array = [JsonObjectClass]() // my array of class type 

//JSON Parsing Code 
func parseLocalFile() { 

    guard let url = Bundle.main.url(forResource: "HeaderFileD", withExtension: "json") else { return } 

    do { 
    let data = try Data(contentsOf: url) 
    let jsonData = try JSONSerialization.jsonObject(with: data, options: []) as! [String:Any] 
    let jsonArray = jsonData["Headers"] as! [[String:Any]] 
    array = jsonArray.map { JsonObjectClass(headerName: $0["headerName"] as! String, 
            sortByNo: $0["sortByNo"] as! Int, 
            headerImageName: $0["headerImageName"] as! String, 
            viewControllerName: $0["viewCotrollerName"] as! String)} 

    for arr in array { 
     print(arr) 
    } 

    } catch let error as NSError { 
    print(error) 
    } 
} 

PS이다 오타 고려 viewControllerName VS viewCotrollerName