JSON dosyası hızlı bir şekilde nasıl ayrıştırılır?


92

Bir JSON dosyam var, tablo görünümünde nesnelerin listesini ayrıştırmak ve kullanmak istiyorum. JSON dosyasını hızlı bir şekilde ayrıştırmak için kodu paylaşabilir mi?


2
Burada bir URL isteğinde bulunan ve sonuçları bir UITableView'a yükleyen bir eğitim var
Chris Stokes

Swift 3 için tamamen güncel bir API yazdım: github.com/borchero/WebParsing
borchero

Yanıtlar:


103

Daha basit olamazdı:

import Foundation

let jsonData: Data = /* get your json data */
let jsonDict = try JSONSerialization.jsonObject(with: jsonData) as? NSDictionary

Bununla birlikte, Swift 4'te sunulan Kodlanabilir API'leri kullanmanızı şiddetle tavsiye ederim .


12
Örneğin,let jsonData = NSData.dataWithContentsOfFile(filepath, options: .DataReadingMappedIfSafe, error: nil)
Caroline

4
Bu yaklaşımla ilgili sorun, bir grup temel nesnesine sahip olmanızdır. Yani NSString, NSNumber, NSArray, NSDictionary veya NSNull. Daha sonra kodunuzda yazılan yerel Swift ile uğraşmak istiyorsanız, bu bir aşağı döküm yükü yaratır. Özellikle iç içe geçmiş sözlükleriniz ve dizileriniz varsa. Bununla nasıl başa çıkılacağını bilen var mı?
califrench

1
Bu türler Swift ve Obj-C arasında köprülenmiştir.
akashivskyy

2
İOS 8.1 bir dosyayı yüklemek için doğru yolu gibi görünüyor: NSData(contentsOfFile: path). Developer.apple.com/library/ios/documentation/Cocoa/Reference/… bakın :
Claude

7
@bubakazouba: Yazık, bir yoruma olumsuz oy veremem. Birkaç şey: 1. Caroline bir dosyadan veri yüklemek için zaten bir pasaj sağladı (OP'nin istediği buydu). 2. Kodunuz, İngilizce dışındaki dil desteği de dahil olmak üzere tüm unicode sembollerini kaybeden ASCII kodlamasını kullanıyor.
akashivskyy

43

API İsteğini Yapmak

var request: NSURLRequest = NSURLRequest(URL: url)
var connection: NSURLConnection = NSURLConnection(request: request, delegate: self, startImmediately: false)

Yanıt için hazırlanıyor

Aşağıdaki gibi bir dizi bildirin

var data: NSMutableData = NSMutableData()

Yanıtı almak

1.

func connection(didReceiveResponse: NSURLConnection!, didReceiveResponse response: NSURLResponse!) {
   // Received a new request, clear out the data object
   self.data = NSMutableData()
}

2.

func connection(connection: NSURLConnection!, didReceiveData data: NSData!) {
   // Append the received chunk of data to our data object
   self.data.appendData(data)
}

3.

func connectionDidFinishLoading(connection: NSURLConnection!) {
   // Request complete, self.data should now hold the resulting info
   // Convert the retrieved data in to an object through JSON deserialization
   var err: NSError
   var jsonResult: NSDictionary = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers, error: nil) as NSDictionary

   if jsonResult.count>0 && jsonResult["results"].count>0 {
      var results: NSArray = jsonResult["results"] as NSArray
      self.tableData = results
      self.appsTableView.reloadData()

   }
}

Bir NSURLConnectionyanıt aldığında, didReceiveResponseyöntemin bizim adımıza çağrılmasını bekleyebiliriz . Bu noktada verilerimizi şöyle diyerek sıfırlıyoruz:self.data = NSMutableData() , yeni bir boş veri nesnesi oluşturarak verilerimizi sıfırlıyoruz.

Bir bağlantı yapıldıktan sonra, yöntemde veri almaya başlayacağız didReceiveData . Burada iletilen veri argümanı, tüm sulu bilgilerimizin geldiği yerdir. Gelen her parçayı tutmamız gerekiyor, bu yüzden onu daha önce temizlediğimiz self.data nesnesine ekliyoruz.

Son olarak, bağlantı tamamlandığında ve tüm veriler alındığında, connectionDidFinishLoadingçağrılır ve uygulamamızdaki verileri kullanmaya hazırız. Yaşasın!

Buradaki connectionDidFinishLoadingyöntem , URL'nizdeki sonuçların serisini kaldırarak NSJSONSerializationham verilerimizi yararlı Dictionarynesnelere dönüştürmek için sınıfı kullanır .


19

JSON adında bir sınıf yazdım, bu da Swift'de JSON işlemeyi ES5'teki JSON nesnesi kadar kolaylaştırıyor.

Swift nesnenizi şu şekilde JSON'a çevirin:

let obj:[String:AnyObject] = [
    "array": [JSON.null, false, 0, "",[],[:]],
    "object":[
        "null":   JSON.null,
        "bool":   true,
        "int":    42,
        "double": 3.141592653589793,
        "string": "a α\t弾\n𪚲",
        "array":  [],
        "object": [:]
    ],
    "url":"http://blog.livedoor.com/dankogai/"
]

let json = JSON(obj)
json.toString()

... veya ip ...

let json = JSON.parse("{\"array\":[...}")

... veya URL.

let json = JSON.fromURL("http://api.dan.co.jp/jsonenv")
Tree Traversal

Öğeleri alt simge aracılığıyla geçirin:

json["object"]["null"].asNull       // NSNull()
// ...
json["object"]["string"].asString   // "a α\t弾\n𪚲"
json["array"][0].asNull             // NSNull()
json["array"][1].asBool             // false
// ...

SwiftyJSON gibi , abone girişi yoksa endişelenmezsiniz.

if let b = json["noexistent"][1234567890]["entry"].asBool {
    // ....
} else {
    let e = json["noexistent"][1234567890]["entry"].asError
    println(e)
}

Aboneliklerden sıkıldıysanız, planınızı şu şekilde ekleyin:

//// schema by subclassing
class MyJSON : JSON {
    init(_ obj:AnyObject){ super.init(obj) }
    init(_ json:JSON)  { super.init(json) }
    var null  :NSNull? { return self["null"].asNull }
    var bool  :Bool?   { return self["bool"].asBool }
    var int   :Int?    { return self["int"].asInt }
    var double:Double? { return self["double"].asDouble }
    var string:String? { return self["string"].asString }
}

Ve sen git:

let myjson = MyJSON(obj)
myjson.object.null
myjson.object.bool
myjson.object.int
myjson.object.double
myjson.object.string
// ...

Umarım beğenirsin.

Yeni xCode 7.3+ ile etki alanınızı istisna listesine eklemeniz önemlidir (NSAppTransportSecurity'i info.plist dosyama nasıl ekleyebilirim? ), Talimatlar için bu gönderiye bakın, aksi takdirde bir taşıma yetkisi hatası alırsınız.


Github deponuzla ilgili bir soru: main.swift'i gerçekte nasıl çalıştırıyorsunuz? Oyun alanından kendi projenizde tanımlanan sınıflara atıfta bulunamayacağınız için (?!) Oyun alanının içinden yürütmekte güçlük çekiyorum. Teşekkürler!
Janos

En son depoda yöntemleri herkese açık olarak işaretledim. Bu,
Beta4

Tamam teşekkürler, gerçekten örnek kodun nasıl çalıştırılacağını arıyordum. Playgroung'u denedim ama JSON sınıfına atıfta bulunamadığım için işe yaramadı (projenizdeki sınıflara atıfta bulunamayacağınız bilinen bir sorun)
Janos

Çalışmasını sağlayamıyorum :( Bu sefer oyun alanında kullanmaya çalışmıyorum, json.swift'inizi projeme ekledim ve başka bir sınıfta kullanmaya çalışıyorum, çalışmıyor. En basit JSON'u denedim: {"id": "Janos"}, JSON nesnesini oluşturdu, toString yöntemini çağırdı, dosya içeriğini doğru bir şekilde tükürdü, ancak myJson ["id"] 'yi çağırdığımda. AsString nil alıyorum. Neyi özlüyorum?
Janos

Yapıcıda bir String geçiren bir JSON nesnesi oluşturmaya çalışıyordum ... Örnekte nasıl yaptığınızı değiştirdim, şimdi bir tedavi çalışıyor. Tek soru, şimdi hangisini kullanacağınızdır, sizin veya SwiftyJSon :)
Janos

4

İşte Swift 2.0'da JSON ve NSData arasındaki dönüşümleri yapmak için bir kod.

// Convert from NSData to json object
func nsdataToJSON(data: NSData) -> AnyObject? {
    do {
        return try NSJSONSerialization.JSONObjectWithData(data, options: .MutableContainers)
    } catch let myJSONError {
        print(myJSONError)
    }
    return nil
}

// Convert from JSON to nsdata
func jsonToNSData(json: AnyObject) -> NSData?{
    do {
        return try NSJSONSerialization.dataWithJSONObject(json, options: NSJSONWritingOptions.PrettyPrinted)
    } catch let myJSONError {
        print(myJSONError)
    }
    return nil;
}

4

Kodlanabilir

Swift ise 4+ şiddetle kullanılması önerilir CodableyerineJSONSerialization .

Bu Codable, iki protokolü içerir: Decodableve Encodable. Bu Decodableprotokol,Data bu protokole uyan özel yapı / sınıfa JSON biçiminde çözmenize .

Örneğin, bu kadar basit Data(iki nesneden oluşan bir dizi) sahip olduğumuz durumu hayal edin.

let data = Data("""
[
    {"name":"Steve","age":56}, 
    {"name":"iPhone","age":11}
]
""".utf8)

sonra takip edin structve protokolü uygulayınDecodable

struct Person: Decodable {
    let name: String
    let age: Int
}

Artık deşifre edebilir Datasizin diziye Personkullanarak JSONDecoderilk parametreyi uygun türüdür Decodablegereken bu tip ve Datadeşifre edilmesi

do {
    let people = try JSONDecoder().decode([Person].self, from: data)
} catch { print(error) }

... kod çözmenin tryanahtar kelime ile işaretlenmesi gerektiğini unutmayın, çünkü örneğin isimlendirmede bazı hatalar yapabilirsiniz ve modelinizin kodu doğru çözülemeyebilir ... bu yüzden do-try-catch bloğunun içine koymalısınız


Json'da anahtarın özellik adından farklı olduğu durumlar:

  • Anahtar içinde snake_case kullanılarak adlandırılır ise, yıllardan dekoder ayarlayabilirsiniz keyDecodingStrategyiçin convertFromSnakeCaseanahtarı değiştirir property_nameCamelCase içinpropertyName

    let decoder = JSONDecoder()
    decoder.keyDecodingStrategy = .convertFromSnakeCase
    let people = try decoder.decode([Person].self, from: data)
    
  • Benzersiz bir ada ihtiyacınız varsa , anahtar adını bildirdiğiniz struct / class içinde kodlama anahtarlarını kullanabilirsiniz .

    let data = Data(""" 
    { "userName":"Codable", "age": 1 } 
    """.utf8)
    
    struct Person: Decodable {
    
        let name: String
        let age: Int
    
        enum CodingKeys: String, CodingKey {
            case name = "userName"
            case age
        }
    }
    

2

Ayrıca json yanıtının bir nesne yapısına eşlenmesi için uzmanlaşmış küçük bir kitaplık yazdım. Dahili olarak David Owens'ın json-swift kütüphanesini kullanıyorum. Belki başkası için yararlıdır.

https://github.com/prine/ROJSONParser

Örnek Employees.json

{
"employees": [
  {
    "firstName": "John",
    "lastName": "Doe",
    "age": 26
  },
  {
    "firstName": "Anna",
    "lastName": "Smith",
    "age": 30
  },
  {
    "firstName": "Peter",
    "lastName": "Jones",
    "age": 45
  }]
}

Bir sonraki adım olarak, veri modelinizi (EmplyoeeContainer ve Employee) oluşturmanız gerekir.

Çalışan.swift

class Employee : ROJSONObject {

    required init() {
        super.init();
    }

    required init(jsonData:AnyObject) {
        super.init(jsonData: jsonData)
    }

    var firstname:String {
        return Value<String>.get(self, key: "firstName")
    }

    var lastname:String {
        return Value<String>.get(self, key: "lastName")            
    }

    var age:Int {
        return Value<Int>.get(self, key: "age")
    }
}

EmployeeContainer.swift

class EmployeeContainer : ROJSONObject {
    required init() {
        super.init();
    }

    required init(jsonData:AnyObject) {
        super.init(jsonData: jsonData)
    }

    lazy var employees:[Employee] = {
        return Value<[Employee]>.getArray(self, key: "employees") as [Employee]
    }()
}

Ardından, JSON yanıtından nesneleri gerçekten eşlemek için, yalnızca verileri yapıcıdaki param olarak EmployeeContainer sınıfına iletmeniz gerekir. Veri modelinizi otomatik olarak oluşturur.

 var baseWebservice:BaseWebservice = BaseWebservice();

  var urlToJSON = "http://prine.ch/employees.json"

  var callbackJSON = {(status:Int, employeeContainer:EmployeeContainer) -> () in
    for employee in employeeContainer.employees {
      println("Firstname: \(employee.firstname) Lastname: \(employee.lastname) age: \(employee.age)")
    }
  }

  baseWebservice.get(urlToJSON, callback:callbackJSON)

Konsol çıktısı şu şekilde görünür:

Firstname: John Lastname: Doe age: 26
Firstname: Anna Lastname: Smith age: 30
Firstname: Peter Lastname: Jones age: 45

başka bir örnekle veri modeli oluşturmama yardımcı olabilir misiniz @Prine
Dilip Tiwari

2

SwiftJSONParse : JSON'u bir baş belası gibi ayrıştırın

Son derece basit ve okunması kolay!

Örnek: bir değer elde "mrap"gelen nicknamesbu JSON yanıtından bir String olarak

{
    "other": {
        "nicknames": ["mrap", "Mikee"]
}

Json verilerinizi NSDataolduğu gibi alır, ön işlemeye gerek yoktur.

let parser = JSONParser(jsonData)

if let handle = parser.getString("other.nicknames[0]") {
    // that's it!
}

Feragatname: Bunu ben yaptım ve umarım herkese yardımcı olur. Onu geliştirmekten çekinmeyin!


Cehaletimi bağışla. Kitaplığınızı SwiftyJSON gibi bir kitaplığa göre kullanmanın avantajları nelerdir?
Levi Roberts

6
Başlangıçta bunu inşa ettim çünkü dil hackleme operatörleri / sembolleri fikrini beğenmedim. Ayrıca Swift'i tanımak için yaptım. Meraktan dolayı bir kıyaslama yaptım ve SwiftyJSON'un üstün hıza sahip olduğunu (~ 2-7 kat daha hızlı) buldum. Deponun README'sini kabul etmek için güncelledim.
Mike Rapadas

Cevabınız için teşekkürler.
Levi Roberts

JSON'dan bir dizi veriyi nasıl yükleyeceğinize dair bir örnek gösterebilir misiniz (temelde bir döngü ile birden çok öğe vb.)
Joseph Astrahan

2

JSON'u Swift'de ayrıştırmak, kod üretimi için mükemmel bir iştir. Bunu yapmak için http://www.guideluxe.com/JsonToSwift adresinde bir araç oluşturdum .

Bir sınıf adıyla örnek bir JSON nesnesi sağlarsınız ve araç, örnek JSON tarafından ima edilen yapıyı temsil etmek için ilgili bir Swift sınıfının yanı sıra gerekli tüm yardımcı Swift sınıflarını da oluşturur. Ayrıca, NSJSONSerialization.JSONObjectWithData yöntemini kullanan biri de dahil olmak üzere Swift nesnelerini doldurmak için kullanılan sınıf yöntemleri de dahildir. NSArray ve NSDictionary nesnelerinden gerekli eşlemeler sağlanır.

Oluşturulan koddan, yalnızca araca sağlanan örnekle eşleşen JSON içeren bir NSData nesnesi sağlamanız gerekir.

Foundation dışında hiçbir bağımlılık yoktur.

Çalışmam http://json2csharp.com/ ' dan ilham aldı. , .NET projeleri için çok kullanışlı olan .

JSON dosyasından bir NSData nesnesinin nasıl oluşturulacağı aşağıda açıklanmıştır.

let fileUrl: NSURL = NSBundle.mainBundle().URLForResource("JsonFile", withExtension: "json")!
let jsonData: NSData = NSData(contentsOfURL: fileUrl)!

1
Ne tür sorunlar yaşıyorsun?
Perry Tribolet

Bunun için üzgünüm, JSON URL'sini doğrudan yapıştırıyordum, JSON yanıtını yapıştırarak iyi çalışıyor. Yine de URL'nin doğrudan yapıştırılmış olması harika olurdu. Ama bu yardımcı program için harika bir iş. Teşekkürler.
ioopl

Yarattığınız araç tek kelimeyle harika. Bu aracı son 6 aydan beri kullanıyorum. Ancak son 3 günden beri aniden web sitenize erişilemiyor ve tarayıcı bu mesajla "Bu siteye ulaşılamıyor" şeklinde yanıt veriyor. Peki bunun arkasındaki sebep nedir?
Saif

2
  1. Swifty Json'ı yükleyin

Not: Eğer bunu arıyorsanız, nasıl kurulacağını bilmeme ihtimaliniz de yüksek swifty. Buradaki talimatları izleyin .

sudo gem install cocoapods

cd ~/Path/To/Folder/Containing/ShowTracker

Ardından şu komutu girin:

pod init

Bu, Podfileprojeniz için bir varsayılan oluşturacaktır . PodfileEğer proje dayanır bağımlılıkları tanımlamak yerdir.

Açmak için bu komutu yazın Podfilekullanarak Xcodedüzenleme için:

open -a Xcode Podfile

Ekle Swiftypodfile içine

platform :ios, '8.0'
use_frameworks!

target 'MyApp' do
    pod 'SwiftyJSON', '~> X.X.X'
end
  1. Bu örneği kontrol edin
var mURL = NSURL(string: "http://api.openweathermap.org/data/2.5/weather?q=London,uk&units=metric")

if mURL == nil{
    println("You are stupid")
    return
}

var request = NSURLRequest(URL: mURL!)

NSURLConnection.sendAsynchronousRequest(
    request,
    queue: NSOperationQueue.mainQueue(),
    completionHandler:{ (
        response: NSURLResponse!, 
        data: NSData!, 
        error: NSError!) -> Void in

    if data != nil {

        var mJSON = JSON(data: data!)

        if let current_conditions = mJSON["weather"][0]["description"].string {
            println("Current conditions: " + current_conditions)
        } else {
            println("MORON!")
        }

        if let current_temperature = mJSON["main"]["temp"].double {
            println("Temperature: "+ String(format:"%.f", current_temperature)  + "°C"
        } else {
            println("MORON!")
        }
    }
})

1

Json parsig'in iki yöntemini kullanarak toplama görünümünde verileri gösteren tüm görüntü denetleyicisi

@IBOutlet weak var imagecollectionview: UICollectionView!
lazy var data = NSMutableData()
var dictdata : NSMutableDictionary = NSMutableDictionary()
override func viewDidLoad() {
    super.viewDidLoad()
    startConnection()
    startNewConnection()
    // Do any additional setup after loading the view, typically from a nib.
}


func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
    return dictdata.count
}
func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {

    let cell  = collectionView.dequeueReusableCellWithReuseIdentifier("CustomcellCollectionViewCell", forIndexPath: indexPath) as! CustomcellCollectionViewCell
    cell.name.text = dictdata.valueForKey("Data")?.valueForKey("location") as? String
    let url = NSURL(string: (dictdata.valueForKey("Data")?.valueForKey("avatar_url") as? String)! )

    LazyImage.showForImageView(cell.image, url:"URL
    return cell
}
func collectionView(collectionView: UICollectionView,
                    layout collectionViewLayout: UICollectionViewLayout,
                           sizeForItemAtIndexPath indexPath: NSIndexPath) -> CGSize {
    let kWhateverHeightYouWant = 100
    return CGSizeMake(self.view.bounds.size.width/2, CGFloat(kWhateverHeightYouWant))
}

func startNewConnection()
{

   let url: URL = URL(string: "YOUR URL" as String)!
    let session = URLSession.shared

    let request = NSMutableURLRequest(url: url as URL)
    request.httpMethod = "GET" //set the get or post according to your request

    //        request.cachePolicy = NSURLRequest.CachePolicy.ReloadIgnoringCacheData
    request.cachePolicy = NSURLRequest.CachePolicy.reloadIgnoringCacheData

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

        guard let _:NSData = data as NSData?, let _:URLResponse = response, error == nil else {
            print("error")
            return
        }

       let jsonString = NSString(data: data!, encoding:String.Encoding.utf8.rawValue) as! String
               }
    task.resume()

}

func startConnection(){
    let urlPath: String = "your URL"
    let url: NSURL = NSURL(string: urlPath)!
    var request: NSURLRequest = NSURLRequest(URL: url)
    var connection: NSURLConnection = NSURLConnection(request: request, delegate: self, startImmediately: false)!
    connection.start()
}

func connection(connection: NSURLConnection!, didReceiveData data: NSData!){
    self.data.appendData(data)
}

func buttonAction(sender: UIButton!){
    startConnection()
}

func connectionDidFinishLoading(connection: NSURLConnection!) {
    do {
        let JSON = try NSJSONSerialization.JSONObjectWithData(self.data, options:NSJSONReadingOptions(rawValue: 0))
        guard let JSONDictionary :NSDictionary = JSON as? NSDictionary else {
            print("Not a Dictionary")
            // put in function
            return
        }
        print("JSONDictionary! \(JSONDictionary)")
        dictdata.setObject(JSONDictionary, forKey: "Data")

        imagecollectionview.reloadData()
    }
    catch let JSONError as NSError {
        print("\(JSONError)")
    }    }

1

ObjectMapper çerçevesini kullanma

if let path = Bundle(for: BPPView.self).path(forResource: jsonFileName, ofType: "json") {
    do {
        let data = try Data(contentsOf: URL(fileURLWithPath: path), options: NSData.ReadingOptions.mappedIfSafe)
        let json = try JSONSerialization.jsonObject(with: data, options: .allowFragments)
        self.levels = Mapper<Level>().mapArray(JSONArray: (json as! [[String : Any]]))!
        print(levels.count)
    } catch let error as NSError {
        print(error.localizedDescription)
    }
} else {
    print("Invalid filename/path.")
}

Uygun setini hazırlamadan önce: Ayrıştırılacak eşlenebilir nesneler

import UIKit 
import ObjectMapper
class Level: Mappable {
var levelName = ""
var levelItems = [LevelItem]()

required init?(map: Map) {

}

// Mappable
func mapping(map: Map) {
    levelName <- map["levelName"]
    levelItems <- map["levelItems"]
}

 import UIKit 
import ObjectMapper 
class LevelItem: Mappable {
var frontBackSide = BPPFrontBack.Undefined
var fullImageName = ""
var fullImageSelectedName = ""
var bodyParts = [BodyPart]()

required init?(map: Map) {

}

// Mappable
func mapping(map: Map) {
    frontBackSide <- map["frontBackSide"]
    fullImageName <- map["fullImageName"]
    fullImageSelectedName <- map["fullImageSelectedName"]
    bodyParts <- map["bodyParts"]
}}

1

Hızlı 3

let parsedResult: [String: AnyObject]
do {      
    parsedResult = try JSONSerialization.jsonObject(with: data, options: .allowFragments) as! [String:AnyObject]       
} catch {        
    // Display an error or return or whatever
}

veri - Veri türü (Yapı) (yani bazı sunucu yanıtları tarafından döndürülür)


0

Bu ayrıştırıcı, JSON'u Swift türlerine dönüştürmek için jenerikleri kullanır ve bu da yazmanız gereken kodu azaltır.

https://github.com/evgenyneu/JsonSwiftson

struct Person {
  let name: String?
  let age: Int?
}

let mapper = JsonSwiftson(json: "{ \"name\": \"Peter\", \"age\": 41 }")

let person: Person? = Person(
  name: mapper["name"].map(),
  age: mapper["age"].map()
)

0

Aşağıda bir Swift Playground örneği verilmiştir:

import UIKit

let jsonString = "{\"name\": \"John Doe\", \"phone\":123456}"

let data = jsonString.data(using: .utf8)

var jsonObject: Any
do {
    jsonObject = try JSONSerialization.jsonObject(with: data!) as Any

    if let obj = jsonObject as? NSDictionary {
        print(obj["name"])
    }
} catch {
    print("error")
}

0

Swift 4

Proje Oluşturun

Bir Düğme ve UITableview ile StoryBoard Tasarlayın

TableViewCell VC oluştur

Düğme Eyleminde Aşağıdaki Kodları Girin

Bir API'deki Veri Dizisini Getirmek İçin Bu Kodu Hatırlayın

import UIKit

class ViewController3: UIViewController,UITableViewDelegate,UITableViewDataSource {

    @IBOutlet var tableView: UITableView!
    var displayDatasssss = [displyDataClass]()
    override func viewDidLoad() {
        super.viewDidLoad()

        // Do any additional setup after loading the view.
    }
    func numberOfSections(in tableView: UITableView) -> Int {
        return 1
    }
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return displayDatasssss.count
    }
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "TableViewCell1") as! TableViewCell1
        cell.label1.text = displayDatasssss[indexPath.row].email
        return cell
    }
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    @IBAction func gettt(_ sender: Any) {

        let url = "http://jsonplaceholder.typicode.com/users"
        var request = URLRequest(url: URL(string: url)!)
        request.httpMethod = "GET"
        let configuration = URLSessionConfiguration.default
        let session = URLSession(configuration: configuration, delegate: nil, delegateQueue: OperationQueue.main)
        let task = session.dataTask(with: request){(data, response,error)in
            if (error != nil){
                print("Error")
            }
            else{
                do{
                    // Array of Data 
                    let fetchData = try JSONSerialization.jsonObject(with: data!, options: .mutableLeaves) as! NSArray

                    for eachData in fetchData {

                        let eachdataitem = eachData as! [String : Any]
                        let name = eachdataitem["name"]as! String
                        let username = eachdataitem["username"]as! String

                        let email = eachdataitem["email"]as! String
                         self.displayDatasssss.append(displyDataClass(name: name, username: username,email : email))
                    }
                    self.tableView.reloadData()
                }
                catch{
                    print("Error 2")
                }

            }
        }
        task.resume()

    }
}
class displyDataClass {
    var name : String
    var username : String
    var email : String

    init(name : String,username : String,email :String) {
        self.name = name
        self.username = username
        self.email = email
    }
}

Bu, Sözlük veri Alımı içindir

import UIKit

class ViewController3: UIViewController,UITableViewDelegate,UITableViewDataSource {

    @IBOutlet var tableView: UITableView!
    var displayDatasssss = [displyDataClass]()
    override func viewDidLoad() {
        super.viewDidLoad()

        // Do any additional setup after loading the view.
    }
    func numberOfSections(in tableView: UITableView) -> Int {
        return 1
    }
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return displayDatasssss.count
    }
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "TableViewCell1") as! TableViewCell1
        cell.label1.text = displayDatasssss[indexPath.row].email
        return cell
    }
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    @IBAction func gettt(_ sender: Any) {

        let url = "http://jsonplaceholder.typicode.com/users/1"
        var request = URLRequest(url: URL(string: url)!)
        request.httpMethod = "GET"
        let configuration = URLSessionConfiguration.default
        let session = URLSession(configuration: configuration, delegate: nil, delegateQueue: OperationQueue.main)
        let task = session.dataTask(with: request){(data, response,error)in
            if (error != nil){
                print("Error")
            }
            else{
                do{
                    //Dictionary data Fetching
                    let fetchData = try JSONSerialization.jsonObject(with: data!, options: .mutableLeaves) as! [String: AnyObject]
                        let name = fetchData["name"]as! String
                        let username = fetchData["username"]as! String

                        let email = fetchData["email"]as! String
                         self.displayDatasssss.append(displyDataClass(name: name, username: username,email : email))

                    self.tableView.reloadData()
                }
                catch{
                    print("Error 2")
                }

            }
        }
        task.resume()

    }
}
class displyDataClass {
    var name : String
    var username : String
    var email : String

    init(name : String,username : String,email :String) {
        self.name = name
        self.username = username
        self.email = email
    }
}

0

Swift 4 API İsteği Örneği

Faydalanmak JSONDecoder().decode

Swift 4 ile JSON ayrıştırma videosunu izleyin


struct Post: Codable {
    let userId: Int
    let id: Int
    let title: String
    let body: String
}

URLSession.shared.dataTask(with: URL(string: "https://jsonplaceholder.typicode.com/posts")!) { (data, response, error) in

    guard let response = response as? HTTPURLResponse else {
        print("HTTPURLResponse error")
        return
    }

    guard 200 ... 299 ~= response.statusCode else {
        print("Status Code error \(response.statusCode)")
        return
    }

    guard let data = data else {
        print("No Data")
        return
    }

    let posts = try! JSONDecoder().decode([Post].self, from: data)
    print(posts)      
}.resume()

0

Swift 2 iOS 9

let miadata = NSData(contentsOfURL: NSURL(string: "https://myWeb....php")!)

do{
    let MyData = try NSJSONSerialization.JSONObjectWithData(miadata!, options: NSJSONReadingOptions.MutableContainers) as? NSArray
    print(".........\(MyData)")    
}
catch let error as NSError{
    // error.description
    print(error.description)
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.