2015-01-01 3 views
0

스위프트에서이를 구현하는 방법이 있습니까?스위프트의 JSON 복합 배열

  1. 연속 요소를 ArrayLiteralConvertible하는 식의 형태 배열을 변환 할 수 없습니다 세미콜론으로 구분해야합니다
  2. 유형 '내부 :

    var z = [ //Error 1 
        { 
         "Name":{ //Error 2 
          "First":"Tika", 
          "Last":"Pahadi" 
         }, 
         "City":"Berlin", 
         "Country":"Germany" 
        } 
    ] 
    
    var c:String = z[0]["Name"]["First"] as String //Error 3 
    

    내가 좋아하는 오류의 무리를 얻을 수 '프로토콜에 맞지 않습니다.'StringLiteralConvertible '

답변

2

Swift에서이 구조를 나타내는 경우 사전뿐만 아니라 배열에도 대괄호를 사용하십시오.

let z = [ 
    [ 
     "Name":[ 
      "First":"Tika", 
      "Last":"Pahadi" 
     ], 
     "City":"Berlin", 
     "Country":"Germany" 
    ] 
] 

let c = z[0]["Name"]?["First"] as String 

을하지만 이제 당신이 정말로 닮은 JSON 피드했다 가정 해 봅시다 : : 그리고 선택적 항목 랩을 해제하는 것을 잊지 마세요 그리고 당신이 그것을 구문 분석 NSJSONSerialization을 사용

[ 
    { 
     "Name": { 
      "First": "Tika", 
      "Last": "Pahadi" 
     }, 
     "City": "Berlin", 
     "Country": "Germany" 
    } 
] 

을하지만, 결과를 예를 들어 스위프트 사전 배열로 캐스팅 할 수 있습니다.

var error: NSError? 
if let jsonObject = NSJSONSerialization.JSONObjectWithData(data, options: nil, error:&error) as? [[String: AnyObject]] { 
    if let firstName = jsonObject[0]["Name"]?["First"] as? String { 
     println(firstName) 
    } 
} 

, 이름을 추출하기위한 패턴은 매우 유사합니다. 또는 항목을 반복 할 수 있습니다.

if let jsonObject = NSJSONSerialization.JSONObjectWithData(data, options: nil, error:&error) as? [[String: AnyObject]] { 
    for personEntry in jsonObject { 
     if let firstName = personEntry["Name"]?["First"] as? String { 
      println(firstName) 
     } 
    } 
} 
1

Swift는 JSON 배열에 어떤 유형이 있는지 추측 할 수 없습니다. 데이터가 배열이라고 추측 할 수 없으며 첫 번째 배열 요소가 사전이라고 추측 할 수 없으며 "Name"키의 값이 사전이라고 추측 할 수 없습니다. 실제로 서버가 보내는 것을 제어 할 수 없기 때문에 이들이 있다는 것을 알지 못합니다.

그래서 NSJSONSerialization이 AnyObject를 반환하면? NSArray *에 캐스팅해야합니다. (NSArray가 아닌 경우 더 좋은 검사를하거나 앱이 충돌합니다.) 배열에 객체가 있는지 확인하고 첫 번째 요소를 NSDictionary *로 캐스팅합니다. NSDictionary *가 아닌 경우 충돌을 피하십시오.) 등등.

+0

"NSArray"로 캐스트해야합니다. "또는 Swift 배열로 이동해야합니다. ;) – Rob