Hoşgeldin. Soru sormak veya cevaplamak için hemen üye ol.

Json parse to struct

0 oy
191 kez görüntülendi
22, Haziran, 2017 ios development kategorisinde csayin tarafından soruldu
22, Haziran, 2017 csayin tarafından düzenlendi

Merhabalar herkese json'dan gelen veriyi bir struct'ın içine parse etmeye çalışıyorum. Json bu fonksiyon ile başarılı bir şekilde geliyor ve print(responSting)'de eksiksiz yazdırılıyor;

func getSales(authorization:String) {

    let url = NSURL(string: "http://api.xxx.com/satislar")

    let request = NSMutableURLRequest(url: url! as URL)

    request.httpMethod = "GET"

    request.addValue(authorization, forHTTPHeaderField: "Authorization")

    let task = URLSession.shared.dataTask(with: request as URLRequest) { data,response,error in

    guard error == nil && data != nil else {
        print("error", error!)
        return
    }

    let httpStatus = response as? HTTPURLResponse

    if httpStatus!.statusCode == 200 {
        if data?.count != 0 {
            let responString = try! JSONSerialization.jsonObject(with: data!, options: .allowFragments) as? NSArray

                    print(responString!, "get sales successful") //buraya kadar tamam

            DispatchQueue.main.async {
                //self.tableView.reloadData()
            }
        } else {
            print("No got data from URL")
        }
    } else { 
        print("error httpstatus code is ", httpStatus!.statusCode)
    }
}
task.resume()
}

böyle bir struct yapısı kurdum;

struct SalesStruct {

    var id:Int
    var name:String
    var date:String
    var product:String
    var price:String
    init(productDetails:[String:String]) {
        self.id = Int(productDetails["REFID"]!) ?? 0
        self.name = productDetails["CAD"]!
        self.date = productDetails["ISLEMTARIHI"]!
        self.product = productDetails["PAKET"]!
        self.price = productDetails["TUTAR"]!
    }
}

şu sekilde de viewcontroller da tanımladım;

var salesDataStack:[SalesStruct] = []

bu da json'dan gelen datanın bir kısmı;

(
        {
        REFID=1
        CAD = "company name";
        ISLEMTARIHI = "11.06.2017";
        PAKET = "product";
        TUTAR = "550,20 $";
    },
{
         REFID=1
        CAD = "company name2";
        ISLEMTARIHI = "16.06.2017";
        PAKET = "product";
        TUTAR = "220,20 $";
    }
)

print(responString!, "get sales successful") dan sonra islemleri yapmam gerek düşüncesiye alttaki 2 örneği denedim ancak sonuca varamadım;

for temp in responString! {
        self.salesDataStack.append(SalesStruct(productDetails: temp as! [String : String]))
}

for temp in responString! {
        let product = SalesStruct(productDetails: temp as! [String : String])
        self.salesDataStack.append(product)
}
23, Haziran, 2017 csayin tarafından yorumlandı

//fonksiyon
func getIpBasedLocationData(authorization:String, completionHandler:@escaping ([IPBasedLocationData]?) -> Void) {
//authorization:String'i ekledim
if let myUrl = URL(string: "http://api.nilvera.com/satislar") {
var request = URLRequest(url: myUrl)
request.httpMethod = "GET"
request.addValue(authorization, forHTTPHeaderField: "Authorization") //token elemanlarini ekledim
URLSession.shared.dataTask(with: request, completionHandler: { (data:Data?, response:URLResponse?, error:Error?) in
if error == nil {
if let httpResponse = response as? HTTPURLResponse {
if httpResponse.statusCode == 200 {
if let receivedData = data {
do {
let jsonObject = try JSONSerialization.jsonObject(with: receivedData, options: .allowFragments)

                                //print(jsonObject)//json basarili

                                if let array = jsonObject as? [[String:Any]] {
                                    var returningData:[IPBasedLocationData] = []
                                    for part in array {

                                        var dataPart = IPBasedLocationData()

                                        if let salesName = part["CAD"] {
                                            if let salesNameInString = salesName as? String {
                                                dataPart.name = salesNameInString
                                            }
                                        }
                                        if let salesId = part["REFID"] {
                                            if let salesIdInt = salesId as? Int {
                                                dataPart.id = salesIdInt
                                            }
                                        }

                                        if let salesDate = part["ISLEMTARIHI"]{
                                            if let salesDateInString = salesDate as? String{
                                                dataPart.date = salesDateInString
                                            }
                                        }
                                        if let salesProduct = part["PAKET"]{
                                            if let salesProductInString = salesProduct as? String{
                                                dataPart.product = salesProductInString
                                            }
                                        }
                                        if let salesPrice = part["TUTAR"]{
                                            if let salesPriceInString = salesPrice as? String{
                                                dataPart.price = salesPriceInString
                                            }
                                        }
                                        returningData.append(dataPart)
                                    }

                                    completionHandler(returningData)
                                } else {
                                    completionHandler(nil)
                                }
                            } catch let jsonError {
                                print("jsonError:\(jsonError.localizedDescription)")
                                completionHandler(nil)
                            }
                        } else {
                            print("there is no recevied data")
                            completionHandler(nil)
                        }
                    } else {
                        print("invalid response:\(httpResponse.statusCode)")
                        completionHandler(nil)
                    }
                } else {
                    completionHandler(nil)
                }
            } else {
                print("request error:\(String(describing: error?.localizedDescription))")
                completionHandler(nil)
            }
        }).resume()
    } else {
        completionHandler(nil)
    }
}

uygun yerde bu sekilde çağırıyoruz;

getIpBasedLocationData(authorization: strTokenType2+" "+strAccessToken) { (locationData:[IPBasedLocationData]?) in

            DispatchQueue.main.async {
                if let receivedLocationData = locationData {
                    for dataPart in receivedLocationData {
                        if let salesName = dataPart.name{
                            print("adi: \(salesName)")
                        }
                        if let salesDate = dataPart.date{
                            print("tarih: \(salesDate)")
                        }
                        if let salesProduct = dataPart.product{
                            print("paket: \(salesProduct)")
                        }
                        if let salesPrice = dataPart.price{
                            print("tutar: \(salesPrice)")
                        }
                        if let salesId = dataPart.id{
                            print("id: \(salesId)")
                        }

                        self.salesDataStack.append(dataPart)

                    }


                } else {
                    print("no location data received")
                }

                self.tableView.reloadData()
                self.activityIndicator.stopAnimating()
                UIApplication.shared.endIgnoringInteractionEvents()
            }

        }

1 cevap

0 oy
22, Haziran, 2017 yasin tarafından cevaplandı
23, Haziran, 2017 csayin tarafından seçilmiş
 
En İyi Cevap

uygulama çöküyor mu?

23, Haziran, 2017 csayin tarafından yorumlandı
23, Haziran, 2017 csayin tarafından yeniden gösterildi

haklısınız anlaşılır şekilde ifade etmemişim; burdan sonra gelen verilerin adı alanını table view'da listeleyip seçilen verinin detay ekranına gidiyor, ve şimdiki amacım table view'da arama yapabilmek. salesDataStack.name alanını kullanabilmeyi hedeflemiştim.

23, Haziran, 2017 csayin tarafından yorumlandı

daha önce sizden cevabını aldığım search bar ve detay örneğinde ki fonksiyonda member hatası alıyorum. asıl sormak istediğim buydu aslında.

!:Value of type '[IPBasedLocationData]' has no member 'name'

func updateSearchResults(for searchController: UISearchController) {
    if let searchString:String = self.searchController.searchBar.text {
        if searchString != "" {
            self.filteredDataStack.removeAll(keepingCapacity: false)

            for dummyData in self.salesDataStack {
                let searchingFocus:String = salesDataStack.name //Value of type '[IPBasedLocationData]' has no member 'name'
                if (searchingFocus.range(of: searchString, options: String.CompareOptions.caseInsensitive, range: nil, locale: nil) != nil) {
                    self.filteredDataStack.append(dummyData)
                }
            }
        } else {
            self.filteredDataStack = self.salesDataStack
        }

        self.tableView.reloadData()
    }
}
23, Haziran, 2017 csayin tarafından yorumlandı

fonsiyondaki hatayı fark ettim ve şu şekilde düzenledim ;

func updateSearchResults(for searchController: UISearchController) {
    if let searchString:String = self.searchController.searchBar.text {

        if searchString != "" {
            self.filteredDataStack.removeAll(keepingCapacity: false)

            for salesData in self.salesDataStack {
                let searchingFocus:String = salesData.name
                if (searchingFocus.range(of: searchString, options: String.CompareOptions.caseInsensitive, range: nil, locale: nil) != nil) {
                    self.filteredDataStack.append(salesData)
                }
            }
        } else {
            self.filteredDataStack = self.salesDataStack
        }

        self.tableView.reloadData()
    }
}

uygulama çalışıyor ama hala arama yapınca table view boşa düsüyor filteredDataStack boş geliyor.

23, Haziran, 2017 csayin tarafından yorumlandı

fonksiyondaki hatayı fark ettim ve düzenledim şuan gayet satabil çalışıyor, yardımlarınız cevaplarınız ve sabrınız için çok teşekkür ederim Yasin hocam.

not: başlıktan gelen arkadaslar icin kafa karisikligi olmasin diye calisan kod blogunu soruyo yorum olarak yazdim.

24, Haziran, 2017 yasin tarafından yorumlandı

Rica ederim. Kolay gelsin

...