2017-09-16 134 views
3

有人能告诉我我做错了什么吗?我已经看过这里的所有问题,如从这里How to decode a nested JSON struct with Swift Decodable protocol?,我发现一个似乎正是我需要的Swift 4 Codable decoding jsonSwift 4使用Codable解码json

{ 
"success": true, 
"message": "got the locations!", 
"data": { 
    "LocationList": [ 
     { 
      "LocID": 1, 
      "LocName": "Downtown" 
     }, 
     { 
      "LocID": 2, 
      "LocName": "Uptown" 
     }, 
     { 
      "LocID": 3, 
      "LocName": "Midtown" 
     } 
    ] 
    } 
} 

struct Location: Codable { 
    var data: [LocationList] 
} 

struct LocationList: Codable { 
    var LocID: Int! 
    var LocName: String! 
} 

class ViewController: UIViewController { 

override func viewDidLoad() { 
    super.viewDidLoad() 

    let url = URL(string: "/getlocationlist") 

    let task = URLSession.shared.dataTask(with: url!) { data, response, error in 
     guard error == nil else { 
      print(error!) 
      return 
     } 
     guard let data = data else { 
      print("Data is empty") 
      return 
     } 

     do { 
      let locList = try JSONDecoder().decode(Location.self, from: data) 
      print(locList) 
     } catch let error { 
      print(error) 
     } 
    } 

    task.resume() 
} 

我得到的错误是:

typeMismatch(Swift.Array, Swift.DecodingError.Context(codingPath: [], debugDescription: "Expected to decode Array but found a dictionary instead.", underlyingError: nil))

回答

5

检查JSON文本的简要构成:

{ 
    "success": true, 
    "message": "got the locations!", 
    "data": { 
     ... 
    } 
} 

"data"的值是一个JSON对象{...},它不是数组。 和对象的结构:

{ 
    "LocationList": [ 
     ... 
    ] 
} 

对象具有单个条目"LocationList": [...]并且它的值是数组[...]

你可能需要一个更结构:

struct Location: Codable { 
    var data: LocationData 
} 

struct LocationData: Codable { 
    var LocationList: [LocationItem] 
} 

struct LocationItem: Codable { 
    var LocID: Int! 
    var LocName: String! 
} 

为了测试...

var jsonText = """ 
{ 
    "success": true, 
    "message": "got the locations!", 
    "data": { 
     "LocationList": [ 
      { 
       "LocID": 1, 
       "LocName": "Downtown" 
      }, 
      { 
       "LocID": 2, 
       "LocName": "Uptown" 
      }, 
      { 
       "LocID": 3, 
       "LocName": "Midtown" 
      } 
     ] 
    } 
} 
""" 

let data = jsonText.data(using: .utf8)! 
do { 
    let locList = try JSONDecoder().decode(Location.self, from: data) 
    print(locList) 
} catch let error { 
    print(error) 
} 
+0

哦,真不错!感谢您的支持。 – Misha