2017-12-06 12 views
0

저는 JSON 피드를 처음 사용하고 신속하게 4 개를 사용했습니다. 중첩 된 JSON 피드에서 데이터를 인쇄하는 데 문제가 있습니다. 첫째, 배열 문을 제대로 호출하는지 확신 할 수 없습니다. 둘째, 앱을 만들 때 다음과 같은 긴 오류가 발생합니다. 누구든지 이걸 해독하도록 도와 줄 수 있습니까? 내 코드는 게시물 하단에 있습니다. 미리 감사드립니다.중첩 된 JSON 피드 반환 오류

2017-12-06 12:58:48.604154-0500 PlayerRankDOTA2[91584:6694163] [BoringSSL] Function boringssl_context_get_peer_sct_list: line 1754 received sct extension length is less than sct data length Error jsonErr dataCorrupted(Swift.DecodingError.Context(codingPath: [PlayerRankDOTA2.PlayerStatsParent.(CodingKeys in _053A446F694D6B16CE13A0E302B3B14A).rankings, Foundation.(_JSONKey in _12768CA107A31EF2DCE034FD75B541C9)(stringValue: "Index 0", intValue: Optional(0)), PlayerRankDOTA2.PlayerStats.(CodingKeys in _053A446F694D6B16CE13A0E302B3B14A).score], debugDescription: "Parsed JSON number <3099.96838722024> does not fit in Int.", underlyingError: nil))"

import UIKit 

struct PlayerStatsParent:Decodable{ 
    let rankings: [PlayerStats] 
} 

struct PlayerStats:Decodable { 
    let personaname: String 
    let score: Int 
    let solo_competitive_rank: Int 
    let avatar: String 
} 

class ViewController: UIViewController { 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     let jsonUrlString = "https://api.opendota.com/api/rankings" 
     guard let url = URL(string: jsonUrlString) else {return} 
     URLSession.shared.dataTask(with: url) { (data, response, error) in 
      guard let data = data else {return} 
      //let dataAsString = String(data: data, encoding: .utf8) 
      //print(dataAsString) 
      do{ 
       let playerStatsParent = try JSONDecoder().decode(PlayerStatsParent.self, from: data) 
       print(playerStatsParent.rankings) 
      } catch let jsonErr { 
       print("Error jsonErr", jsonErr) 
      } 
     }.resume() 
    } 

    let jsonUrlString = "https://api.opendota.com/api/rankings" 

} 
+0

디코딩하려고하는 JSON 응답을 포함하십시오. –

+0

PlayerStats 구조체의 모든 변수를 기록하려고하지만 PlayerStatsParent 구조체의 순위 변수에 저장됩니다. –

+0

API에서받은 실제 JSON을 의미합니다 ... 디코딩하려는 내용을 보지 않고 무엇이 잘못 됐는지를 말하기는 어렵습니다. –

답변

0

당신은 당신의 PlayerStats에 몇 가지 변경을해야합니다. 무엇보다 먼저 scoreDouble이어야합니다. 이는 API가 반환하는 형식이기 때문입니다. 둘째, 모든 값은 JSON 응답에서 null이 될 수 있습니다. 이 문제를 해결하는 한 가지 방법은 모든 속성을 선택 사항으로 정의하는 것입니다.

struct PlayerStats:Decodable { 
    let personaname: String? 
    let score: Double? 
    let solo_competitive_rank: Int? 
    let avatar: String? 
} 

위의 형식으로 PlayerStats 구조체를 변경 한 후, 디코딩은 잘 작동합니다.

+0

완벽하게 작동했습니다. 내가 물어 보는 것에 별 상관이 없다면 점수 변수가 API에서 Double로 반환되는 것을 어떻게 발견 했습니까? –

+0

JSON 응답을 내 브라우저에서 확인한 다음 Postman에서 확인했습니다. –