Membaca dalam File JSON Menggunakan Swift

206

Saya benar-benar berjuang dengan mencoba membaca file JSON ke Swift sehingga saya bisa bermain dengannya. Saya telah menghabiskan bagian terbaik dari 2 hari mencari kembali dan mencoba metode yang berbeda tetapi belum beruntung, jadi saya telah mendaftar ke StackOverFlow untuk melihat apakah ada yang bisa mengarahkan saya ke arah yang benar .....

File JSON saya disebut test.json dan berisi yang berikut ini:

{
  "person":[
     {
       "name": "Bob",
       "age": "16",
       "employed": "No"
     },
     {
       "name": "Vinny",
       "age": "56",
       "employed": "Yes"
     }
  ]
}    

File disimpan dalam dokumen secara langsung dan saya mengaksesnya menggunakan kode berikut:

let file = "test.json"
let dirs : String[] = NSSearchPathForDirectoriesInDomains(
                                                          NSSearchpathDirectory.DocumentDirectory,
                                                          NSSearchPathDomainMask.AllDomainMask,
                                                          true) as String[]

if (dirs != nil) {
    let directories: String[] = dirs
    let dir = directories[0]
    let path = dir.stringByAppendingPathComponent(file)
}

var jsonData = NSData(contentsOfFile:path, options: nil, error: nil)
println("jsonData \(jsonData)" // This prints what looks to be JSON encoded data.

var jsonDict = NSJSONSerialization.JSONObjectWithData(jsonData, options: nil, error: nil) as? NSDictionary

println("jsonDict \(jsonDict)") - This prints nil..... 

Jika ada yang bisa memberi saya dorongan ke arah yang benar tentang bagaimana saya bisa menderialisasi file JSON dan meletakkannya di objek Swift yang dapat diakses, saya akan sangat berterima kasih!

Salam,

Krivvenz.

Krivvenz
sumber
1
gunakan parameter kesalahan ...
Matthias Bauch
2
Silakan kirim kode aktual yang dapat dikompilasi. Seperti sekarang, pathhanya terlihat dalam iflingkup, dan tidak terselesaikan ketika Anda menggunakannya NSData(contentsOfFile, options, error); Anda juga memiliki kesalahan ketik dalam nama enum.
Kreiri
1
API saya sepenuhnya diperbarui untuk Swift 3: github.com/borchero/WebParsing
borchero
ini adalah kunci -> "nilai": "% LOAD VALUE FROM tmclass.json file%" dan saya perlu mem-parse JSON lain dari file lalu bagaimana saya bisa mencapainya dalam SWIFT?
Mayur Shinde

Jawaban:

288

Ikuti kode di bawah ini:

if let path = NSBundle.mainBundle().pathForResource("test", ofType: "json")
{
    if let jsonData = NSData(contentsOfFile: path, options: .DataReadingMappedIfSafe, error: nil)
    {
        if let jsonResult: NSDictionary = NSJSONSerialization.JSONObjectWithData(jsonData, options: NSJSONReadingOptions.MutableContainers, error: nil) as? NSDictionary
        {
            if let persons : NSArray = jsonResult["person"] as? NSArray
            {
                // Do stuff
            }
        }
     }
}

Array "orang" akan berisi semua data untuk orang kunci. Iterasi melalui untuk mengambilnya.

Swift 4.0:

if let path = Bundle.main.path(forResource: "test", ofType: "json") {
    do {
          let data = try Data(contentsOf: URL(fileURLWithPath: path), options: .mappedIfSafe)
          let jsonResult = try JSONSerialization.jsonObject(with: data, options: .mutableLeaves)
          if let jsonResult = jsonResult as? Dictionary<String, AnyObject>, let person = jsonResult["person"] as? [Any] {
                    // do stuff
          }
      } catch {
           // handle error
      }
}
Abhishek
sumber
4
Akan lebih membantu jika Anda menjelaskan mengapa / bagaimana ini memecahkan masalah yang dijelaskan dalam pertanyaan, bukan hanya menyajikan banyak kode.
Martin R
Hai Abhishek - Terima kasih atas jawaban Anda tetapi masih tidak berhasil. Itu menyebabkan aplikasi crash dengan kesalahan di bawah ini: 2014-06-25 16: 02: 04.146 H&S Capture [4937: 131932] *** Mengakhiri aplikasi karena pengecualian tanpa tertangkap 'NSInvalidArgumentException', alasan: '*** - [_NSPlaceholderData initWithContentsOfFile: options: error:]: argumen file nil '*** Pertama-tama tumpukan panggilan panggil: Ada gagasan tentang mengapa ini? Untuk opsi jsonData: Saya masukkan (path, opsi: NSDataReadingOptions.DataReadingMappedIfSafe, error: nil)
Krivvenz
Jalur file Anda tidak benar. Sebenarnya, tidak ada file bernama test.json di jalur yang Anda tentukan. Silakan periksa lokasi file yang benar
Abhishek
15
"let jsonData = NSData (contentOfFile: path!)" bukan "let jsonData = NSData.dataWithContentsOfFile (path, options: .DataReadingMappedIfSafe, error: nil)"
tong
7
Lebih baik menggunakan pernyataan penjaga lain di sini daripada piramida malapetaka ini.
Zonily Jame
140

Jika ada yang mencari SwiftyJSON Jawab:
Pembaruan:
Untuk Swift 3/4:

if let path = Bundle.main.path(forResource: "assets/test", ofType: "json") {
    do {
        let data = try Data(contentsOf: URL(fileURLWithPath: path), options: .alwaysMapped)
        let jsonObj = try JSON(data: data)
        print("jsonData:\(jsonObj)")
    } catch let error {
        print("parse error: \(error.localizedDescription)")
    }
} else {
    print("Invalid filename/path.")
}
Aks
sumber
2
ini mengubah saya menjadi swiftyJSON dan carthage! terima kasih :)
Paul Wand
saya menggunakannya hanya untuk menemukan itu tidak memiliki pemetaan objek, saya akan mencoba perpustakaan lain kali
Elazaron
Untuk menghindari kesalahan salin di swift 3: NSData dan NSError menjadi Data and Error.
selva
Saya mencoba beberapa metode berbeda dan ini berhasil untuk saya di Swift 3
crobicha
(!) Karena MacOS 10.6 / iOS 4 ada API url(forResourcedi (NS)Bundleuntuk menghindari langkah ekstra untuk membuat URL
Vadian
102

Swift 4 menggunakan Decodable

struct ResponseData: Decodable {
    var person: [Person]
}
struct Person : Decodable {
    var name: String
    var age: String
    var employed: String
}

func loadJson(filename fileName: String) -> [Person]? {
    if let url = Bundle.main.url(forResource: fileName, withExtension: "json") {
        do {
            let data = try Data(contentsOf: url)
            let decoder = JSONDecoder()
            let jsonData = try decoder.decode(ResponseData.self, from: data)
            return jsonData.person
        } catch {
            print("error:\(error)")
        }
    }
    return nil
}

Cepat 3

func loadJson(filename fileName: String) -> [String: AnyObject]? {
    if let url = Bundle.main.url(forResource: fileName, withExtension: "json") {
        do {
            let data = try Data(contentsOf: url)
            let object = try JSONSerialization.jsonObject(with: data, options: .allowFragments)
            if let dictionary = object as? [String: AnyObject] {
                return dictionary
            }
        } catch {
            print("Error!! Unable to parse  \(fileName).json")
        }
    }
    return nil
}
yarlg
sumber
9
Ini harus dipindahkan ke fitur dokumentasi baru, atau ditandai sebagai jawaban yang benar.
sistem
24

Xcode 8 Swift 3 membaca json dari pembaruan file:

    if let path = Bundle.main.path(forResource: "userDatabseFakeData", ofType: "json") {
        do {
            let jsonData = try NSData(contentsOfFile: path, options: NSData.ReadingOptions.mappedIfSafe)
            do {
                let jsonResult: NSDictionary = try JSONSerialization.jsonObject(with: jsonData as Data, options: JSONSerialization.ReadingOptions.mutableContainers) as! NSDictionary
                if let people : [NSDictionary] = jsonResult["person"] as? [NSDictionary] {
                    for person: NSDictionary in people {
                        for (name,value) in person {
                            print("\(name) , \(value)")
                        }
                    }
                }
            } catch {}
        } catch {}
    }
ben
sumber
14

Nama yang diperbarui untuk Swift 3.0

Berdasarkan jawaban Abhishek dan jawaban Druva

func loadJson(forFilename fileName: String) -> NSDictionary? {

    if let url = Bundle.main.url(forResource: fileName, withExtension: "json") {
        if let data = NSData(contentsOf: url) {
            do {
                let dictionary = try JSONSerialization.jsonObject(with: data as Data, options: .allowFragments) as? NSDictionary

                return dictionary
            } catch {
                print("Error!! Unable to parse  \(fileName).json")
            }
        }
        print("Error!! Unable to load  \(fileName).json")
    }

    return nil
}
Nick Graham
sumber
12

Menyederhanakan contoh yang diberikan oleh Peter Kreinz. Bekerja dengan Swift 4.2.

Fungsi ekstensi:

extension Decodable {
  static func parse(jsonFile: String) -> Self? {
    guard let url = Bundle.main.url(forResource: jsonFile, withExtension: "json"),
          let data = try? Data(contentsOf: url),
          let output = try? JSONDecoder().decode(self, from: data)
        else {
      return nil
    }

    return output
  }
}

Model contoh:

struct Service: Decodable {
  let name: String
}

Contoh penggunaan:

/// service.json
/// { "name": "Home & Garden" }

guard let output = Service.parse(jsonFile: "service") else {
// do something if parsing failed
 return
}

// use output if all good

Contoh ini juga akan bekerja dengan array:

/// services.json
/// [ { "name": "Home & Garden" } ]

guard let output = [Service].parse(jsonFile: "services") else {
// do something if parsing failed
 return
}

// use output if all good

Perhatikan bagaimana kami tidak menyediakan obat generik yang tidak perlu, jadi kami tidak perlu memberikan hasil penguraian.

NeverwinterMoon
sumber
10

Swift 2.1 menjawab (berdasarkan pada Abhishek):

    if let path = NSBundle.mainBundle().pathForResource("test", ofType: "json") {
        do {
            let jsonData = try NSData(contentsOfFile: path, options: NSDataReadingOptions.DataReadingMappedIfSafe)
            do {
                let jsonResult: NSDictionary = try NSJSONSerialization.JSONObjectWithData(jsonData, options: NSJSONReadingOptions.MutableContainers) as! NSDictionary
                if let people : [NSDictionary] = jsonResult["person"] as? [NSDictionary] {
                    for person: NSDictionary in people {
                        for (name,value) in person {
                            print("\(name) , \(value)")
                        }
                    }
                }
            } catch {}
        } catch {}
    }
kjm
sumber
10

Swift 3.0, Xcode 8, iOS 10

 if let path = Bundle.main.url(forResource: "person", withExtension: "json") {

        do {
            let jsonData = try Data(contentsOf: path, options: .mappedIfSafe)
            do {
                if let jsonResult = try JSONSerialization.jsonObject(with: jsonData, options: JSONSerialization.ReadingOptions(rawValue: 0)) as? NSDictionary {
                    if let personArray = jsonResult.value(forKey: "person") as? NSArray {
                        for (_, element) in personArray.enumerated() {
                            if let element = element as? NSDictionary {
                                let name = element.value(forKey: "name") as! String
                                let age = element.value(forKey: "age") as! String
                                let employed = element.value(forKey: "employed") as! String
                                print("Name: \(name),  age: \(age), employed: \(employed)")
                            }
                        }
                    }
                }
            } catch let error as NSError {
                print("Error: \(error)")
            }
        } catch let error as NSError {
            print("Error: \(error)")
        }
    }

Keluaran:

Name: Bob,  age: 16, employed: No
Name: Vinny,  age: 56, employed: Yes
Ashok R
sumber
7

Ini sangat membantu saya

func readjson(fileName: String) -> NSData{

    let path = NSBundle.mainBundle().pathForResource(fileName, ofType: "json")
    let jsonData = NSData(contentsOfMappedFile: path!)

    return jsonData!
}
Abdulaziz Noor
sumber
7

Ini solusi saya menggunakan SwiftyJSON

if let path : String = NSBundle.mainBundle().pathForResource("filename", ofType: "json") {
    if let data = NSData(contentsOfFile: path) {

        let json = JSON(data: data)

    }
}
will.fiset
sumber
7
fileprivate class BundleTargetingClass {}
func loadJSON<T>(name: String) -> T? {
  guard let filePath = Bundle(for: BundleTargetingClass.self).url(forResource: name, withExtension: "json") else {
    return nil
  }

  guard let jsonData = try? Data(contentsOf: filePath, options: .mappedIfSafe) else {
    return nil
  }

  guard let json = try? JSONSerialization.jsonObject(with: jsonData, options: .allowFragments) else {
    return nil
  }

  return json as? T
}

👆🏻 copy-paste siap, solusi pihak ketiga kerangka independen

penggunaan 👇🏻

let json:[[String : AnyObject]] = loadJSON(name: "Stations")!

Maciej Banasiewicz
sumber
ini bekerja untuk saya. Saya perlu membuat kode obat dari daftar obat yang bisa dicari ke dalam aplikasi. Saya mendapat file json dari database mySQL. Saya menjatuhkan file json ke proyek XCODE saya yang berjalan di atas di viewDidLoad dan saya punya kamus json saya !!!
Brian
5

Saya memberikan jawaban lain karena tidak ada yang di sini diarahkan memuat sumber daya dari bundel tes. Jika Anda menggunakan layanan jarak jauh yang mengeluarkan JSON dan ingin menguji unit parsing hasil tanpa memukul layanan yang sebenarnya, Anda mengambil satu atau lebih tanggapan dan memasukkannya ke dalam file di folder Tes di proyek Anda.

func testCanReadTestJSONFile() {
    let path = NSBundle(forClass: ForecastIOAdapterTests.self).pathForResource("ForecastIOSample", ofType: "json")
    if let jsonData = NSData(contentsOfFile:path!) {
        let json = JSON(data: jsonData)
        if let currentTemperature = json["currently"]["temperature"].double {
            println("json: \(json)")
            XCTAssertGreaterThan(currentTemperature, 0)
        }
    }
}

Ini juga menggunakan SwiftyJSON tetapi logika inti untuk mendapatkan bundel uji dan memuat file adalah jawaban untuk pertanyaan itu.

rampok
sumber
5

Swift 4: Coba solusi saya:

test.json

{
    "person":[
        {
            "name": "Bob",
            "age": "16",
            "employed": "No"
        },
        {
            "name": "Vinny",
            "age": "56",
            "employed": "Yes"
        }
    ]
}

RequestCodable.swift

import Foundation

struct RequestCodable:Codable {
    let person:[PersonCodable]
}

PersonCodable.swift

import Foundation

struct PersonCodable:Codable {
    let name:String
    let age:String
    let employed:String
}

Dapat didekodekan + FromJSON.swift

import Foundation

extension Decodable {

    static func fromJSON<T:Decodable>(_ fileName: String, fileExtension: String="json", bundle: Bundle = .main) throws -> T {
        guard let url = bundle.url(forResource: fileName, withExtension: fileExtension) else {
            throw NSError(domain: NSURLErrorDomain, code: NSURLErrorResourceUnavailable)
        }

        let data = try Data(contentsOf: url)

        return try JSONDecoder().decode(T.self, from: data)
    }
}

Contoh:

let result = RequestCodable.fromJSON("test") as RequestCodable?

result?.person.compactMap({ print($0) }) 

/*
PersonCodable(name: "Bob", age: "16", employed: "No")
PersonCodable(name: "Vinny", age: "56", employed: "Yes")
*/
Peter Kreinz
sumber
1
fromJSONFungsi ekstensi Anda melempar, namun dalam contoh Anda menyebutnya tanpa trykata kunci. Kode ini tidak akan dikompilasi.
NeverwinterMoon
Juga, untuk fromJSONAnda menggunakan ekstensi Decodable, namun Anda tidak menggunakan informasi apa pun dari jenis Decodable tetapi memberikan tambahan (benar-benar tidak berguna) generik.
NeverwinterMoon
3

Swift 3.0 terbaru benar-benar berfungsi

func loadJson(filename fileName: String) -> [String: AnyObject]?
{
    if let url = Bundle.main.url(forResource: fileName, withExtension: "json") 
{
      if let data = NSData(contentsOf: url) {
          do {
                    let object = try JSONSerialization.jsonObject(with: data as Data, options: .allowFragments)
                    if let dictionary = object as? [String: AnyObject] {
                        return dictionary
                    }
                } catch {
                    print("Error!! Unable to parse  \(fileName).json")
                }
            }
            print("Error!! Unable to load  \(fileName).json")
        }
        return nil
    }
Khushboo
sumber
3

Swift 4 JSONuntuk ClassdenganDecodable - untuk mereka yang lebih kelas

Tentukan kelas sebagai berikut:

class People: Decodable {
  var person: [Person]?

  init(fileName : String){
    // url, data and jsonData should not be nil
    guard let url = Bundle.main.url(forResource: fileName, withExtension: "json") else { return }
    guard let data = try? Data(contentsOf: url) else { return }
    guard let jsonData = try? JSONDecoder().decode(People.self, from: data) else { return }

    // assigns the value to [person]
    person = jsonData.person
  }
}

class Person : Decodable {
  var name: String
  var age: String
  var employed: String
}

Penggunaan, cukup abstrak:

let people = People(fileName: "people")
let personArray = people.person

Ini memungkinkan metode untuk kelas Peopledan Person, variabel (atribut) dan metode juga dapat ditandai seolah- privateolah diperlukan.

Marco Leong
sumber
3

Kode berikut ini berfungsi untuk saya. Saya menggunakan Swift 5

let path = Bundle.main.path(forResource: "yourJSONfileName", ofType: "json")
var jsonData = try! String(contentsOfFile: path!).data(using: .utf8)!

Kemudian, jika Struct Person Anda (atau Kelas) adalah Decodable (dan juga semua propertinya), Anda dapat melakukannya:

let person = try! JSONDecoder().decode(Person.self, from: jsonData)

Saya menghindari semua kode penanganan kesalahan untuk membuat kode lebih mudah dibaca.

Abraham Simpson
sumber
2

Diperbarui untuk Swift 3 dengan cara teraman

    private func readLocalJsonFile() {

    if let urlPath = Bundle.main.url(forResource: "test", withExtension: "json") {

        do {
            let jsonData = try Data(contentsOf: urlPath, options: .mappedIfSafe)

            if let jsonDict = try JSONSerialization.jsonObject(with: jsonData, options: .mutableContainers) as? [String: AnyObject] {

                if let personArray = jsonDict["person"] as? [[String: AnyObject]] {

                    for personDict in personArray {

                        for (key, value) in personDict {

                            print(key, value)
                        }
                        print("\n")
                    }
                }
            }
        }

        catch let jsonError {
            print(jsonError)
        }
    }
}

masukkan deskripsi gambar di sini

iAj
sumber
2

Swift 5.1, Xcode 11

Anda bisa menggunakan ini:


struct Person : Codable {
    let name: String
    let lastName: String
    let age: Int
}

func loadJson(fileName: String) -> Person? {
   let decoder = JSONDecoder()
   guard
        let url = Bundle.main.url(forResource: fileName, withExtension: "json"),
        let data = try? Data(contentsOf: url),
        let person = try? decoder.decode(Person.self, from: data)
   else {
        return nil
   }

   return person
}
Gonzer
sumber
1

Berdasarkan jawaban Abhishek , untuk iOS 8 ini adalah:

let masterDataUrl: NSURL = NSBundle.mainBundle().URLForResource("masterdata", withExtension: "json")!
let jsonData: NSData = NSData(contentsOfURL: masterDataUrl)!
let jsonResult: NSDictionary = NSJSONSerialization.JSONObjectWithData(jsonData, options: nil, error: nil) as! NSDictionary
var persons : NSArray = jsonResult["person"] as! NSArray
David Poxon
sumber
Apakah Anda menggunakan Swift 2.0? Maka ya, itulah masalahnya. Ini dijawab sebelum 2.0.
David Poxon
1

Ini bekerja untuk saya dengan XCode 8.3.3

func fetchPersons(){

    if let pathURL = Bundle.main.url(forResource: "Person", withExtension: "json"){

        do {

            let jsonData = try Data(contentsOf: pathURL, options: .mappedIfSafe)

            let jsonResult = try JSONSerialization.jsonObject(with: jsonData, options: .mutableContainers) as! [String: Any]
            if let persons = jsonResult["person"] as? [Any]{

                print(persons)
            }

        }catch(let error){
            print (error.localizedDescription)
        }
    }
}
anoop4real
sumber
1

Swift 4.1 Xcode Diperbarui 9.2

if let filePath = Bundle.main.path(forResource: "fileName", ofType: "json"), let data = NSData(contentsOfFile: filePath) {

     do {
      let json = try JSONSerialization.jsonObject(with: data as Data, options: JSONSerialization.ReadingOptions.allowFragments)        
        }
     catch {
                //Handle error
           }
 }
Saranjith
sumber
3
Tidak ada yang baru, justru sebaliknya: Jangan gunakan NSDatadi Swift 3+, dan .allowFragmentstidak ada gunanya dalam hal ini.
vadian
1
//change type based on your struct and right JSON file

let quoteData: [DataType] =
    load("file.json")

func load<T: Decodable>(_ filename: String, as type: T.Type = T.self) -> T {
    let data: Data

    guard let file = Bundle.main.url(forResource: filename, withExtension: nil)
        else {
            fatalError("Couldn't find \(filename) in main bundle.")
    }

    do {
        data = try Data(contentsOf: file)
    } catch {
        fatalError("Couldn't load \(filename) from main bundle:\n\(error)")
    }

    do {
        let decoder = JSONDecoder()
        return try decoder.decode(T.self, from: data)
    } catch {
        fatalError("Couldn't parse \(filename) as \(T.self):\n\(error)")
    }
}

ASHISH RANJAN
sumber
0

Saya telah menggunakan kode di bawah ini untuk mengambil JSON dari file FAQ-data.json yang ada di direktori proyek.

Saya menerapkan di Xcode 7.3 menggunakan Swift.

     func fetchJSONContent() {
            if let path = NSBundle.mainBundle().pathForResource("FAQ-data", ofType: "json") {

                if let jsonData = NSData(contentsOfFile: path) {
                    do {
                        if let jsonResult: NSDictionary = try NSJSONSerialization.JSONObjectWithData(jsonData, options: NSJSONReadingOptions.MutableContainers) as? NSDictionary {

                            if let responseParameter : NSDictionary = jsonResult["responseParameter"] as? NSDictionary {

                                if let response : NSArray = responseParameter["FAQ"] as? NSArray {
                                    responseFAQ = response
                                    print("response FAQ : \(response)")
                                }
                            }
                        }
                    }
                    catch { print("Error while parsing: \(error)") }
                }
            }
        }

override func viewWillAppear(animated: Bool) {
        fetchFAQContent()
    }

Struktur file JSON:

{
    "status": "00",
    "msg": "FAQ List ",
    "responseParameter": {
        "FAQ": [
            {                
                "question":Question No.1 here”,
                "answer":Answer goes here”,  
                "id": 1
            },
            {                
                "question":Question No.2 here”,
                "answer":Answer goes here”,
                "id": 2
            }
            . . .
        ]
    }
}
Jayprakash Dubey
sumber
0

Saya mungkin juga merekomendasikan Tutorial Swift JSON milik Ray Wenderlich (yang juga mencakup alternatif SwiftyJSON yang mengagumkan, Gloss ). Kutipan (yang diberikan, dengan sendirinya, tidak sepenuhnya menjawab poster, tetapi nilai tambah dari jawaban ini adalah tautannya, jadi tidak ada -1 untuk itu, tolong):

Di Objective-C, parsing dan deserializing JSON cukup mudah:

NSArray *json = [NSJSONSerialization JSONObjectWithData:JSONData
options:kNilOptions error:nil];
NSString *age = json[0][@"person"][@"age"];
NSLog(@"Dani's age is %@", age);

Dalam Swift, parsing dan deserializing JSON sedikit lebih membosankan karena Swift opsional dan tipe-keselamatan [tetapi sebagai] bagian dari Swift 2.0 guardpernyataan itu diperkenalkan untuk membantu menghilangkan ifpernyataan bersarang :

var json: Array!
do {
  json = try NSJSONSerialization.JSONObjectWithData(JSONData, options: NSJSONReadingOptions()) as? Array
} catch {
  print(error)
}

guard let item = json[0] as? [String: AnyObject],
  let person = item["person"] as? [String: AnyObject],
  let age = person["age"] as? Int else {
    return;
}
print("Dani's age is \(age)")

Tentu saja, di XCode 8.x, Anda cukup mengetuk bilah spasi dan berkata, "Hai, Siri, tolong deserialisasi JSON ini untuk saya di Swift 3.0 dengan spasi / tab-indent."

AmitaiB
sumber
0

SWIFTYJSON VERSION SWIFT 3

func loadJson(fileName: String) -> JSON {

    var dataPath:JSON!

    if let path : String = Bundle.main.path(forResource: fileName, ofType: "json") {
        if let data = NSData(contentsOfFile: path) {
             dataPath = JSON(data: data as Data)
        }
    }
    return dataPath
}
Ahmed Safadi
sumber
0

Pertama buat Struc codable seperti ini:

  struct JuzgadosList : Codable {
    var CP : Int
    var TEL : String
    var LOCAL : String
    var ORGANO : String
    var DIR : String
}

Sekarang deklarasikan variabelnya

 var jzdosList = [JuzgadosList]()

Baca dari direktori utama

func getJsonFromDirectory() {

        if let path = Bundle.main.path(forResource: "juzgados", ofType: "json") {
            do {
                let data = try Data(contentsOf: URL(fileURLWithPath: path), options: .alwaysMapped)
                let jList = try JSONDecoder().decode([JuzgadosList].self, from: data)
                self.jzdosList = jList

                DispatchQueue.main.async() { () -> Void in
                    self.tableView.reloadData()
                }

            } catch let error {
                print("parse error: \(error.localizedDescription)")
            }
        } else {
            print("Invalid filename/path.")
        }
    }

Baca dari web

func getJsonFromUrl(){

        self.jzdosList.removeAll(keepingCapacity: false)

        print("Internet Connection Available!")

        guard let url = URL(string: "yourURL")  else { return }

        let request = URLRequest(url: url, cachePolicy: URLRequest.CachePolicy.reloadIgnoringLocalCacheData, timeoutInterval: 60.0)
        URLSession.shared.dataTask(with: request) { (data, response, err) in
            guard let data = data else { return }
            do {
                let jList = try JSONDecoder().decode([JuzgadosList].self, from: data)
                self.jzdosList = jList

                DispatchQueue.main.async() { () -> Void in
                    self.tableView.reloadData()
                }
            } catch let jsonErr {
                print("Error serializing json:", jsonErr)
            }
        }.resume()
    }
castellon oscar
sumber
0

Gunakan fungsi generik ini

func readJSONFromFile<T: Decodable>(fileName: String, type: T.Type) -> T? {
    if let url = Bundle.main.url(forResource: fileName, withExtension: "json") {
        do {
            let data = try Data(contentsOf: url)
            let decoder = JSONDecoder()
            let jsonData = try decoder.decode(T.self, from: data)
            return jsonData
        } catch {
            print("error:\(error)")
        }
    }
    return nil
}

dengan baris kode ini:

let model = readJSONFromFile(fileName: "Model", type: Model.self)

untuk tipe ini:

struct Model: Codable {
    let tall: Int
}
Khaled Annajar
sumber