2016-12-02 13 views
0

JSON 데이터를 구문 분석하지 못했습니다.NSArray 및 NSDictionary를이 SQL 데이터와 함께 어떻게 사용할 수 있습니까?

형식 '__NSArrayI'(0x10f02fc08)을 'NSMutableArray'(0x10f02fcd0)로 변환 할 수 없습니다.

JSON 데이터 here 및 코드는 여기에 있습니다.

echo json_encode($resultArray); 

그리고 여기에 내 시험 코드가 있습니다.

func parseJSON() { 
    var jsonResult: NSMutableArray = NSMutableArray() 

    do{ 
     jsonResult = try JSONSerialization.jsonObject(with: self.data as Data, options:JSONSerialization.ReadingOptions.allowFragments) as! NSMutableArray 
    } catch let error as NSError { 
     print(error) 
    } 

    var jsonElement: NSDictionary = NSDictionary() 
    let locations: NSMutableArray = NSMutableArray() 

    for i in 1...jsonResult.count 
    { 
     jsonElement = jsonResult[i-1] as! NSDictionary 

     let location = LocationModel() 

     if let name = jsonElement["Name"] as? String, 
      let address = jsonElement["Address"] as? String, 
      let latitude = jsonElement["Latitude"] as? String, 
      let longitude = jsonElement["Longitude"] as? String 
     { 
      location.name = name 
      location.address = address 
      location.latitude = latitude 
      location.longitude = longitude 

     } 
     locations.add(location) 
    } 
    DispatchQueue.main.async(execute: {() -> Void in 

     self.delegate.itemsDownloaded(items: locations) 

    }) 
} 
+2

왜 Swift에서 NSDictionary, NSArray 등을 사용하고 있습니까? – Alexander

+0

@Ali 안녕하세요. 죄송 합니다만 귀하의 질문은 아직 명확하지 않습니다. 검색 방법을 잘 모르는 경우 [내 JSON 답변] (http://stackoverflow.com/search?tab=votes&q=user%3a2227743%20json)을 검색하여 시작할 수 있다고 제안 할 수 있습니까? 상당히 많은 부분이 있습니다. 모든 관련 링크를 통해 문제를 해결할 수있는 충분한 자료를 얻을 수 있습니다. 또는 독서 후 문제를 더 잘 설명 할 수 있어야합니다. 행운을 빕니다! – Moritz

+0

@ EricAya 5 분 같이 업데이트하자. – Ali

답변

0

참고 :

var jsonResult: NSArray = NSArray() 

과 대신 :

jsonResult = try JSONSerialization.jsonObject(with: self.data as Data, options:JSONSerialization.ReadingOptions.allowFragments) as! NSMutableArray 
이렇게

var jsonResult: NSMutableArray = NSMutableArray() 

: IT는 THIS

대신 해결됩니다

이 작업을 수행 :

jsonResult = try JSONSerialization.jsonObject(with: self.data as Data, options:JSONSerialization.ReadingOptions.allowFragments) as! NSArray 

전체 코드를 :

func parseJSON() { 
    var jsonResult: NSArray = NSArray() 
    do{ 
     jsonResult = try JSONSerialization.jsonObject(with: self.data as Data, options:JSONSerialization.ReadingOptions.allowFragments) as! NSArray 
    } catch let error as NSError { 
     print(error) 
    } 

    var jsonElement: NSDictionary = NSDictionary() 
    let locations: NSMutableArray = NSMutableArray() 

    for i in 1...jsonResult.count 
    { 
     jsonElement = jsonResult[i-1] as! NSDictionary 

     let location = LocationModel() 

     if let name = jsonElement["Name"] as? String, 
      let address = jsonElement["Address"] as? String, 
      let latitude = jsonElement["Latitude"] as? String, 
      let longitude = jsonElement["Longitude"] as? String 
     { 

      location.name = name 
      location.address = address 
      location.latitude = latitude 
      location.longitude = longitude 

     } 

     locations.add(location) 

    } 
    DispatchQueue.main.async(execute: {() -> Void in 

     self.delegate.itemsDownloaded(items: locations) 

    }) 
} 
0

문제는 JSONSerialization가 아닌 가변 배열을 반환, 당신은 단지 NSMutableArrayNSArray 캐스팅 할 수 없다는 것입니다. 아마 좋겠, 개인적으로

func parseJSON() { 
    var jsonResult: [[String: Any]] // this is an array of dictionaries 

    do { 
     jsonResult = try JSONSerialization.jsonObject(with: data as Data) as! [[String: Any]] 
    } catch let error as NSError { 
     print(error) 
     return 
    } 

    for jsonElement in jsonResult {    
     if let name = jsonElement["Name"] as? String, 
      let address = jsonElement["Address"] as? String, 
      let latitude = jsonElement["Latitude"] as? String, 
      let longitude = jsonElement["Longitude"] as? String 
     { 
      let location = LocationModel() 
      location.name = name 
      location.address = address 
      location.latitude = latitude 
      location.longitude = longitude 
      locations.add(location) // or, if you defined `locations` to be a Swift array, `locations.append(location)` 
     } 
    } 
    ... 
} 

(:

func parseJSON() { 
    var jsonResult: NSArray 

    do { 
     jsonResult = try JSONSerialization.jsonObject(with: data as Data) as! NSArray 
    } catch let error as NSError { 
     print(error) 
     return 
    } 

    ... 
} 

을 또는 대안 오래된 NSArrayNSDictionary 유형에 다시 떨어지는 것보다 스위프트의 기본 수집 유형을 대신 사용하는 대신, 단지 NSArray로 선언 또한 [LocationModel]보다는 NSMutableArraylocationsNSData보다는 Data가되도록 data를 정의하고 정의한다.)