Невозможно получить данные из вложенного json swift - PullRequest
0 голосов
/ 06 декабря 2018

Я учусь быстро.

У меня есть json с сервера.

[
  {
    "dId": 1,
    "vendor": {
      "vendorId": 1,
      "name": "Gems",
      "about": "Get Good quality stones",
      "address": "JacksonVille Road",
      "latitude": 12.232323,
      "longitude": 77.230802,
    },
    "name": "Gems Delight",
  }
]

Я не могу разобрать этот json и получить данные из lat, lon и name изvendor.

Мой метод url и мой цикл for Как мне точно получить широту и долготу из цикла и поместить их на карту?

My View действительно загрузил метод

       override func viewDidLoad() {
        super.viewDidLoad()

        guard let gitUrl = URL(string: "localhost:8080/deals") else { return }
        URLSession.shared.dataTask(with: gitUrl) { (data, response
            , error) in
            guard let data = data else { return }
            do {
                let json = try JSONSerialization.jsonObject(with: data, options: .mutableContainers)

                var lat:Double
                var lon:Double
                var nam = ""
                for items in json as! [AnyObject]{
//                    let te = type(of: items)
//                    print(te)
                    let new = items["vendor"]

                    for (it,key) in new as! [String:Any]{
//                        print(it,key)
//                        print(it["longitude"])

                        if it == "longitude"{
                            print(it,key)
                            lon = key as! Double
                        }
                        if it == "latitude"{
                            print(it,key)
                            lat = key as! Double
                        }

                        if it == "name"{
                            nam = key as! String


                        }

                            if (nam.isEmpty == false){
                            print("falsdalsdasldasd")
                            self.locationManager.delegate = self
                            self.locationManager.requestWhenInUseAuthorization()
                            self.locationManager.startUpdatingLocation()
                            let camera = GMSCameraPosition.camera(withLatitude:lat, longitude:lon, zoom: 4.0)
                            let subView = GMSMapView.map(withFrame: self.view.bounds,camera:camera)
                            let marker = GMSMarker()
                            marker.position = CLLocationCoordinate2D(latitude:lat, longitude:lon)
                            marker.title = nam
                            //                        marker.snippet = "Australia"
                            marker.map = subView

                            self.mapView.addSubview(subView)
                        }




//                        print(it["longitude"])

                    }
//                    let te = type(of: items)
//                    for it in new as![AnyObject]{
////                        print(it"])
//                        print(it)
//
//                    }
//                    print(items["vendor"].["latitude"])
//                    print(items.vendor)
//                    print(items[""])
//                    let nam = items["name"];
//                    let desc = items["description"];
//                    self.locationNames.append(nam as! String)
//                    self.locationDescription.append(desc as! String)
//

                }
//                self.colecVw.delegate = self
//                self.colecVw.dataSource = self
//                self.colecVw.reloadData()

                //                }

            } catch let err {
                print("Err", err)
            }
            }.resume()


        print("coming here")


        //         Create a GMSCameraPosition that tells the map to display the
        //         coordinate -33.86,151.20 at zoom level 6.
        //       let mapView = GMSMapView(frame: CGRect(x: 0, y: 64, width: self.currentDeviceSize.width, height: self.bottomBgView.frame.minY - 64))
//        view = mapView
//
//        // Creates a marker in the center of the map.
//        let marker = GMSMarker()
//        marker.position = CLLocationCoordinate2D(latitude: -33.86, longitude: 151.20)
//        marker.title = "Sydney"
//        marker.snippet = "Australia"
//        marker.map = mapView    
    }

Пожалуйста, помогите мне, поскольку я учусь кодировать, мой код может быть неправильным, пожалуйста, не возражайте и загрузите данные lat и long на карту.Должен ли я создать объект и поместить его туда?

Variable 'lon' used before being initialized
Variable 'lat' used before being initialized

Это ошибка, которую я получаю из кода.

Ответы [ 3 ]

0 голосов
/ 06 декабря 2018

См. Этот

 let json = try JSONSerialization.jsonObject(with: data, options: .mutableContainers)

Передать JSON

 if let data = json as? NSArray {
    for data in data {
        if let data = data as? [String: AnyObject] {
            let dataID = data["dId"] as? Int

            if let data = data[“vendor”] as? [String: AnyObject] {
                let vendorID = data["vendorId"] as? Int
            }
        }
    }
}

enter image description here

0 голосов
/ 06 декабря 2018

Ошибки возникают из-за того, что lat и lon должны иметь значение в строке

let camera = GMSCameraPosition.camera(withLatitude:lat, longitude:lon, zoom: 4.0)

, которое не гарантируется в случае неудачного сравнения key.

Условие выполняется, если вы пишете

var lat = 0.0 // The type Double is inferred
var lon = 0.0

Но вместо того, чтобы перечислять словарь, получите значения для ключей напрямую и безопасно с необязательным связыванием

do {
    // no mutableContainers !!
    let json = try JSONSerialization.jsonObject(with: data) as! [[String:Any]]

    for item in json {
        if let vendor = item["vendor"] as? [String:Any],
            let lat = vendor["latitude"] as? Double,
            let lon = vendor["longitude"] as? Double,
            let name = item["name"] as? String, !name.isEmpty {

            print("falsdalsdasldasd")
            // self.locationManager.delegate = self
            // self.locationManager.requestWhenInUseAuthorization()
            // self.locationManager.startUpdatingLocation()
            let camera = GMSCameraPosition.camera(withLatitude:lat, longitude:lon, zoom: 4.0)
            let subView = GMSMapView.map(withFrame: self.view.bounds,camera:camera)
            let marker = GMSMarker()
            marker.position = CLLocationCoordinate2D(latitude:lat, longitude:lon)
            marker.title = name
            marker.map = subView
            self.mapView.addSubview(subView)
        }
    }
} catch {
    print("Err", error)
}

И бессмысленно вызывать методы LocationManager в каждой итерации.Позвоните им один раз в начале viewDidLoad

override func viewDidLoad() {
    super.viewDidLoad()
    self.locationManager.delegate = self
    self.locationManager.requestWhenInUseAuthorization()
    self.locationManager.startUpdatingLocation()

...
0 голосов
/ 06 декабря 2018

Можно попробовать

struct Root: Codable {
    let dID: Int
    let vendor: Vendor
    let name: String

    enum CodingKeys: String, CodingKey {
        case dID = "dId"
        case vendor, name
    }
}

struct Vendor: Codable {
    let vendorID: Int
    let name, about, address: String
    let latitude, longitude: Double

    enum CodingKeys: String, CodingKey {
        case vendorID = "vendorId"
        case name, about, address, latitude, longitude
    }
}

-

let arr = try? JSONDecoder().decode([Root].self, from:data)

print(arr?.forEach {$0.vendor.latitude })
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...