Ios 在没有结构/模型的情况下读取JSON属性

Ios 在没有结构/模型的情况下读取JSON属性,ios,arrays,json,swift,Ios,Arrays,Json,Swift,如何从服务器响应JSON字符串中提取数组 JSON对象被序列化为: do { if let json = try JSONSerialization.jsonObject(with: data, options: .mutableContainers) as? [String: Any] { print(json) // output below } } catch let error

如何从服务器响应JSON字符串中提取数组

JSON对象被序列化为:

    do {
        if let json = try JSONSerialization.jsonObject(with: data, options: .mutableContainers) as? [String: Any] {
        print(json)  // output below                      
        }
    } catch let error {
        print(error.localizedDescription)
    }
结果是:

    ["locations": <__NSArrayM 0x280e23f90>(
    {
        lat = "123.111111";
        long = "1.111111";
    },
    {
        lat = "123.222222";
        long = "1.222222";
    },
    {
        lat = "123.333333";
        long = "1.333333";
    }
    ),
    "mobileNo": 55551234, 
    "clientID": 2123456789, 
    "date": 10082019, 
    "time": 1854]
如何从json变量中读取mobileNo和clientID等属性,更重要的是,如何将locations数组放入数组或字典中


感谢您的帮助。

使用JSONDecoder和Decodable

创建响应结构。 要解码的用户JSONDecoder
使用JSONDecoder和可解码

创建响应结构。 要解码的用户JSONDecoder
您能提供原始json而不是打印结果吗?另外,我建议使用-它非常容易使用,比使用JSONSerialization.jsonObject更容易。您能为我们提供原始json而不是打印结果吗?另外,我建议使用-它非常容易使用,比使用JSONSerialization.jsonObject更容易。谢谢您的详细回答。直接访问属性的缺点是什么?我们如何做到这一点,尤其是使用数组?对我来说,使用codable比直接访问属性更容易。要访问位置数组,只需像这样解析它[[String:Any]],那么对于mobileNo,它将是let-mobileNo=json[mobileNo],而位置数组将是let-locations=json[locations]as[[String:Any]]?对于mobileNo,它将是let-mobileNo=json[mobileNo]as?谢谢你详细的回答。直接访问属性的缺点是什么?我们如何做到这一点,尤其是使用数组?对我来说,使用codable比直接访问属性更容易。要访问位置数组,只需像这样解析它[[String:Any]],那么对于mobileNo,它将是let-mobileNo=json[mobileNo],而位置数组将是let-locations=json[locations]as[[String:Any]]?对于mobileNo,它将是let-mobileNo=json[mobileNo]as?Int
struct Model: Decodable {

  struct Location: Decodable {
    var lat: String
    var long: String
  }

  var locations: [Location]
  var mobileNo: Int
  var clientId: Int
  var date: Int
  var time: Int

}

    do {
        if let response: Model = try JSONDecoder().decode(Model.self, for: data) {
            print(response)
        }
    } catch let error {
        print(error.localizedDescription)
    }