2016-04-09 32 views
0

Sadece hızlı öğrenmeye başladım. Bu yüzden eğer hızlı gelirse bir noob'um. Denemek ve pratik yapmak için ios için bir bakkal uygulaması yapmaya çalışıyorum. Ama şimdi, muhtemelen standart hızlı kodla bir kütüphane kullanmadan JSON nesnesini serileştiren en temel şeylerden biri üzerinde sıkışıp kaldım. Bu yüzden benim sorum, api'den aldığım verileri serileştirerek problemimi çözmeme yardımcı olabilir.Swift'de JSON serileştirmeye çalışırken neden hata alıyorum?

API'dan ne tür bir yanıt aldığımı kontrol etmek için postacıyı kullanıyorum.

[ 
    { 
    "id": 1, 
    "name": "Regular List" 
    }, 
    { 
    "id": 2, 
    "name": "List for diner" 
    }, 
    { 
    "id": 3, 
    "name": "List 3" 
    }, 
    { 
    "id": 4, 
    "name": "List for next week" 
    }, 
    { 
    "id": 6, 
    "name": "Test name" 
    } 
] 

benim hızlı kodunda Bunu yaparak bu yanıt almak çalışıyorum:

func getBoodschapListJSON(){ 
     let prefs:NSUserDefaults = NSUserDefaults.standardUserDefaults() 
     let userId = prefs.integerForKey("UserId") 
     let requestUrl = NSURL(string: "http://localhost:8080/api/lists/user/id/\(userId)")! 
     let session = NSURLSession.sharedSession() 

     let request = NSMutableURLRequest(URL: requestUrl) 
     request.HTTPMethod = "GET" 
     request.setValue("application/json; charset=utf-8", forHTTPHeaderField: "Content-Type") 

     session.dataTaskWithRequest(request, completionHandler: { (data, response, error) in 

       do { 
        let json = try NSJSONSerialization.JSONObjectWithData(data!, options: .AllowFragments) 

        //Here comes some code to try and process the JSON object in the table View. 
       } catch { 
        print("error serializing JSON: \(error)") 
       } 

     }).resume() 
    } 

Ama geçerli bir got asla ben api'sine bir get yaptığınızda bu yanıtı alıyorum olduğunu Ben hata ile sona cevabı: : karakterin etrafında "hata seri JSON hata Alan = NSCocoaErrorDomain Kod = 3840 'Geçersiz değer 0.' UserInfo = {karakterin etrafında NSDebugDescription = Geçersiz değer 0.}"

bunu bekliyoruz JSON ile sağda olmamak için bir şey var NSJSONSerialization'un bunu yorumlayabilmesi için biçimlendirin. Ama emin değilim, elimde olduğu gibi aynı soruya sahip bir yığın yığma yazılarına baktım. Birçoğu .AllowFragments kullanmak için söyledi ama bu benim hatamı çözmedi.

Bana yardım edecek kadar nazik olabilir mi bu yüzden bu hatayı kodumda düzeltebilirim?

+0

Lütfen json sunucunuzdan doğru biçimde hava durumunu kontrol edin. Aynı şeyi jsonlint.com adresinde veya başka bir json doğrulayıcısında kontrol edebilirsiniz. –

+0

@ArunGupta jsonlint.com ile kontrol ettim, geçerli json. Benim şüphe vardı: "NSJSONSerialization.JSONObjectWithData (veri !, seçenekler: .AllowFragments) deneyin" yöntemi, api tarafından döndürülen json yorumlama yeteneğine sahip. Sanırım doğru parametreleri kullandım ama bir noob'um, böylece hatalar kolayca yapılabilir. – user3473161

+0

"Kurulum" klasörünü ve API kodunuzu gönderebilir misiniz? – ntoonio

cevap

0

URL'niz biraz garip görünüyor, ancak bunun böyle çalışması için hala mümkündür. Tarayıcınızdaki URL'yi ziyaret etmeyi deneyin (userId için bir kimlik belirleyin) ve iyi göründüğünden emin olun. Eğer varsa, API kodunuzda html olmadığından emin olun. Örneğin, hiçbir meta etiketi kullanmıyor olabilirsiniz.

Bu işe yaramazsa, belki de koddur. Deneyin mayın: o NSDictionary bu diziyi dönüştürme ve Sözlük dönüştürmek değerlerini .. Bir örnek kullandıktan sonra

let urlAsString = "http://localhost:8080/api/lists/user/id/\(userId)" 
do { 
    let jsonDict: NSDictionary = try NSJSONSerialization.JSONObjectWithData(NSData(contentsOfURL: NSURL(string: urlString)!)!, options: NSJSONReadingOptions.MutableContainers) as! NSDictionary 
    print (jsonDict) 
} 
catch { 
    print ("Couldn't get JSON... \(error)") 
} 
+0

Tavsiyeniz için teşekkürler. Gerçekten bu URL olamayacağını düşündüm çünkü birkaç kez kontrol ettim. Şimdi tarayıcıda kontrol ettim ve bir cevap almadığımı fark ettim. Sanırım hala bir hatam var, benden bu olduğunda nefret ediyorum. Kodun yanlış olduğunu düşündüm ama sonuçta url oldu. Ama şimdi merak ediyorum, hangi kod daha iyi, seninki veya benimki? Çünkü her ikisi de şimdi çalışıyor ve ben en iyi uygulamayı kullanmak istiyorum. – user3473161

+0

@ user3473161 Bilmiyorum, büyük bir fark olduğunu sanmıyorum. Benim versiyonumu kullananlar için benimkini daha kolay düşünün. Ne istediğini seç! :) – ntoonio

+0

@ user3473161 Yeni bir JSON kodu buldum. Çok daha kısa ve daha az karmaşık.Eminim bu en iyisi – ntoonio

0

kullanımı bu basit kodu olan JSON dizisi

let data = NSData(contentsOfURL: NSURL(string: "your URL")!) 


     let jsonArray: NSArray = try! NSJSONSerialization.JSONObjectWithData(data!, options: .MutableContainers) as! NSArray 

almak için

let cell = tableView.dequeueReusableCellWithIdentifier("atCell")! as UITableViewCell 

     let maindata = (data[indexPath.row] as! NSDictionary) 
     cell.textLabel?.text = maindata["date"] as? String 

ps Bir tablo kulladım Verileri göstermek için ...

İlgili konular