2017-01-12 1 views
1

Alamofire을 사용하여 만든 HTTP 호출에서 데이터로 반환되는 JSON 문자열을 처리하고 싶습니다.Alamofire in Swift : 사용 가능한 JSON 사전에서 응답 데이터 변환

This questionSwiftyJSON을 사용합니다.

그러나 "조금 낮은 수준"으로 가서 응답 개체를 사전으로 변환하는 방법을 알고 싶었습니다.

추론은 사전이 JSON 객체로 응답을 변환하는 과정을 거치지 않고 응답의 JSON 값에 간단하고 쉬운 방법으로 액세스 할 수 있다고 생각하는 것입니다.

이것은 JSON 개체와 사전이 같은 것인가?입니다. 여기

은 내가 쓴 샘플 함수입니다 :

func question() -> Void{ 
    let response : DataRequest = Alamofire.request("http://aapiurl", parameters: nil) 

    // Working with JSON Apple developer guide: 
    // https://developer.apple.com/swift/blog/?id=37 

    response.responseJSON { response in 
     if let JSON = response.result.value 
     { 

      print("JSON: \(JSON)") // Works! 

      let data = JSON as! NSMutableDictionary 
      // Casting fails 
      // Could not cast value of type '__NSCFArray' (0x19f952150) to 'NSMutableDictionary' (0x19f9523f8). 
      print("Data: \(data)") 
     } 
    } 
} 

편집 : json으로 개체는 모든 유형의 것으로 보인다과에서 제안하는 방법 중 하나가없는

아래 답변.

는 내가 사전에 변환 할 노력하고 아래의 오류를 가지고있다 : 가 (또는 최상위 레벨에 가능하게 배열)을 사용하여 Dictionary입니다

enter image description here

+0

여기서 '데이터'는 NSArray 유형입니다. 당신은'let data = JSON as try! NSArray'. –

+0

Mhh ... 네 말이 맞습니다. 나는 배열을 반복하고 Dictionary (http : // stackoverflow)로 변환 할 수있다.co.kr/questions/31446960/convert-swift-array-to-dictionary with indexes)를 참조하십시오. 이게 최선의 관행인가? 평소에 무엇을합니까? – mm24

+0

JSON.mutablearray ("key")처럼! NSMutableDictionary –

답변

0

JSON 객체입니다.

Swift에서 NSMutableDictionary 또는 NSDictionary (또는 NSArray 또는 NSMutableArray)을 사용하지 않아야합니다.

또한 JSON 개체가 작동하는 개체가 아닙니다. JSON은 데이터를 이동하는 방법입니다. 데이터 소스로 사용되지 않습니다.

JSON에서 가져온 정보를 편집하려면 해당 JSON에서 적절한 데이터 객체를 만들고 작업해야합니다.

그런 다음이 새 데이터에서 JSON을 전송해야하는 경우 데이터 개체를 가져와 사전 및 배열 (JSON 개체)으로 다시 변환하고 해당 데이터를 전송합니다. 그것은 일반적으로 배열 또는 사전 것이기 때문에

+0

답변 주셔서 감사합니다. 경험상 JSON 객체에 액세스하는 가장 좋은 방법은 무엇입니까? 위의 주석 중 하나는 내가 응답으로 얻은 데이터가 Array 유형이라고 제안했습니다. 사용 가능한 JSON 객체 (모든 키와 값을 나열 할 수 있음)에서 배열을 변환하는 것이 쉽지는 않습니다. – mm24

+0

@ mm24 JSON이 배열 인 경우 배열이됩니다. 배열의 키와 값에 액세스하는 것은 의미가 없습니다. JSON을 실제 Swift 객체 (아마도 구조체)의 배열로 변환해야합니다. 일단 JSON에 대해 잊어 버리면됩니다. – Fogmeister

+0

변수 JSON을 살펴보면 Any 유형임을 나타냅니다. 사전에 캐스트하려고하면 실패합니다 (업데이트 된 질문 참조). – mm24

-1
Alamofire.request(myUrl) 
     .responseJSON { 
      response in 

      if let dict = response.result.value as? [String : Any] { 

       debugPrint(dict) 

       wishLists.removeAll() //[[String:Any]] 

       let lists = dict["wishlists"] as! [String: Any] 

       debugPrint(lists) 

       for (key, value) in lists { 

        var list = value as! [String: Any] 

        wishLists.append(list) 

       } 

       debugPrint(wishLists) 

       self.tableView.reloadData() 

      } 

    } 
+0

이것은 Alamofire의 작동 방식이 아닙니다. 'responseJSON'을 사용하면 이미 데이터를 JSON 객체로 파싱합니다. 게다가, OP는 데이터를 JSON으로 구문 분석하는 방법을 묻지 않습니다. – Fogmeister

+0

responseJSON 데이터를 처리하는 방법에 대한 몇 가지 예제 코드가 있습니까? JSON 객체의 키/값 쌍에 액세스하고 싶습니다. – mm24

+0

@Fogmeister가 위의 의견을 바탕으로 내 대답을 편집했습니다. – markhorrocks

0

Alamofire 형 Any 결과 값을 갖는다. Swift에서는 보통 NS * 클래스를 사용하지 말고 ArrayDictionary과 같은 기본 빠른 유형을 사용해야합니다.

당신은 반환 된 JSON 객체로보고 선택적 항목을 사용 (해야) 할 수 있습니다

if let array = response.result.value as? [Any] { 
    print("Got an array with \(array.count) objects") 
} 
else if let dictionary = response.result.value as? [AnyHashable: Any] { 
    print("Got a dictionary: \(dictionary)") 
} 
... 

당신이 당신의 백엔드에서 기대에 따라, 당신은 성공 또는 실패로 각각의 경우를 처리 할 수 ​​있습니다.