Đọc trong tệp JSON bằng Swift


205

Tôi thực sự vật lộn với việc cố đọc một tệp JSON vào Swift để tôi có thể chơi xung quanh nó. Tôi đã dành 2 ngày tốt nhất để tìm kiếm lại và thử các phương pháp khác nhau nhưng chưa có may mắn nào nên tôi đã đăng ký với StackOverFlow để xem có ai có thể chỉ cho tôi đi đúng hướng .....

Tệp JSON của tôi được gọi là test.json và chứa các mục sau:

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

Các tập tin được lưu trữ trong các tài liệu trực tiếp và tôi truy cập nó bằng mã sau đây:

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..... 

Nếu bất cứ ai có thể giúp tôi đi đúng hướng về cách tôi có thể hủy tuần tự hóa tệp JSON và đặt nó vào một đối tượng Swift có thể truy cập, tôi sẽ biết ơn mãi mãi!

Trân trọng,

Krivvenz.


1
sử dụng tham số lỗi ...
Matthias Bauch

2
Xin vui lòng gửi mã thực tế, biên dịch. Như hiện tại, pathchỉ hiển thị trong ifphạm vi và chưa được giải quyết khi bạn sử dụng nó trong NSData(contentsOfFile, options, error); bạn cũng có lỗi chính tả trong tên enum.
Kreiri

1
API của tôi được cập nhật đầy đủ cho Swift 3: github.com/borchero/WebParsing
borchero

đây là khóa -> "giá trị": "% LOAD GIÁ TRỊ TỪ tệp tm class.json%" và tôi cần phân tích một JSON khác từ tệp sau đó làm thế nào tôi có thể đạt được điều này trong SWIFT?
Mayur Shinde

Câu trả lời:


287

Thực hiện theo mã dưới đây:

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
            }
        }
     }
}

Mảng "người" sẽ chứa tất cả dữ liệu cho người quan trọng. Lặp lại thông qua để lấy nó.

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
      }
}

4
Sẽ hữu ích hơn nếu bạn giải thích tại sao / làm thế nào điều này giải quyết vấn đề được mô tả trong câu hỏi, thay vì chỉ trình bày một loạt mã.
Martin R

Xin chào Abhishek - Cảm ơn câu trả lời của bạn nhưng nó vẫn không hoạt động. Điều đó khiến ứng dụng bị sập với lỗi dưới đây: 2014-06-25 16: 02: 04.146 H & S Capture [4937: 131932] *** Chấm dứt ứng dụng do ngoại lệ chưa được xử lý 'NSInvalidArgumentException', lý do: '*** - [_NSPlaceholderData initWithContentsOfFile: tùy chọn: error:]: nil tệp đối số '*** Ngăn xếp cuộc gọi đầu tiên: Có ý tưởng nào về lý do này không? Đối với các tùy chọn jsonData: Tôi đặt (đường dẫn, tùy chọn: NSDataReadOptions.DataReadMapped IfSafe, lỗi: nil)
Krivvenz

Đường dẫn tập tin của bạn không chính xác. Thông thường, không có tệp có tên test.json tại đường dẫn do bạn chỉ định. Vui lòng kiểm tra vị trí chính xác của tệp
Abhishek

15
"chúng ta hãy jsonData = NSData (contentsOfFile: con đường!)" thay vì "chúng ta hãy jsonData = NSData.dataWithContentsOfFile (đường dẫn, lựa chọn: .DataReadingMappedIfSafe, lỗi: không)"
tong

7
Mặc dù vậy, tốt hơn là sử dụng các tuyên bố bảo vệ khác ở đây thay vì kim tự tháp diệt vong này.
Zonily Jame

140

Nếu bất cứ ai đang tìm kiếm SwiftyJSON Trả lời:
Cập nhật:
Dành cho 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.")
}

2
điều này biến tôi thành swiftyJSON và carthage! cảm ơn :)
Paul Wand

tôi đã sử dụng nó chỉ để phát hiện ra nó thiếu ánh xạ đối tượng, tôi sẽ thử một thư viện khác vào lần tới
Elazaron

Để tránh sao chép lỗi dán trong swift 3: NSData và NSError đã trở thành Dữ liệu và Lỗi.
selva

Tôi đã thử một vài phương pháp khác nhau và điều này làm việc tốt nhất cho tôi trong Swift 3
crobicha

(!) Kể từ khi hệ điều hành MacOS 10,6 / iOS 4 có một API url(forResourcetrong (NS)Bundleđể tránh những bước thêm để tạo URL
vadian

102

Swift 4 sử dụng 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
}

Swift 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
}

9
Điều này nên được chuyển đến tính năng tài liệu mới, hoặc được đánh dấu là câu trả lời đúng.
hệ thống

24

Xcode 8 Swift 3 đọc json từ cập nhật tệp:

    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 {}
    }

14

Tên cập nhật cho Swift 3.0

Dựa trên câu trả lời của Abhishekcâu trả lời của 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
}

12

Đơn giản hóa ví dụ được cung cấp bởi Peter Kreinz. Hoạt động với Swift 4.2.

Hàm mở rộng:

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
  }
}

Mô hình ví dụ:

struct Service: Decodable {
  let name: String
}

Cách sử dụng ví dụ:

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

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

// use output if all good

Ví dụ này cũng sẽ hoạt động với mảng:

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

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

// use output if all good

Lưu ý cách chúng tôi không cung cấp bất kỳ khái quát không cần thiết nào, do đó chúng tôi không cần đưa ra kết quả phân tích cú pháp.


10

Câu trả lời của Swift 2.1 (dựa trên Abhishek's):

    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 {}
    }

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)")
        }
    }

Đầu ra:

Name: Bob,  age: 16, employed: No
Name: Vinny,  age: 56, employed: Yes

7

Điều này làm việc rất tốt với tôi

func readjson(fileName: String) -> NSData{

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

    return jsonData!
}

7

Đây là giải pháp của tôi bằng SwiftyJSON

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

        let json = JSON(data: data)

    }
}

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
}

Sao chép-dán sẵn sàng, giải pháp độc lập khung bên thứ 3.

sử dụng

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


Điều này làm việc cho tôi. Tôi cần mã hóa một danh sách các loại thuốc có thể tìm kiếm vào một ứng dụng. Tôi đã nhận được tập tin json từ cơ sở dữ liệu myQuery. Tôi đã bỏ tập tin json vào dự án XCODE của tôi đang chạy ở trên trong viewDidLoad và bam Tôi đã có từ điển json của mình !!!
Brian

5

Tôi đang cung cấp một câu trả lời khác bởi vì không ai trong số những người ở đây đang hướng đến việc tải tài nguyên từ gói thử nghiệm. Nếu bạn đang sử dụng một dịch vụ từ xa đưa ra JSON và muốn đơn vị kiểm tra phân tích kết quả mà không cần nhấn dịch vụ thực tế, bạn thực hiện một hoặc nhiều phản hồi và đưa chúng vào các tệp trong thư mục Kiểm tra trong dự án của bạn.

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)
        }
    }
}

Điều này cũng sử dụng SwiftyJSON nhưng logic cốt lõi của việc lấy gói kiểm tra và tải tệp là câu trả lời cho câu hỏi.


5

Swift 4: Hãy thử giải pháp của tôi:

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
}

Có thể giải mã + 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)
    }
}

Thí dụ:

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")
*/

1
fromJSONHàm mở rộng của bạn ném, nhưng trong ví dụ bạn gọi nó mà không có trytừ khóa. Mã này sẽ không biên dịch.
NeverwinterMoon

Ngoài ra, đối với fromJSONbạn sử dụng tiện ích mở rộng Có thể giải mã, nhưng bạn không sử dụng bất kỳ thông tin nào từ loại Giải mã được nhưng cung cấp thêm các tổng quát (hoàn toàn vô dụng).
NeverwinterMoon

3

Swift mới nhất 3.0 hoàn toàn hoạt động

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
    }

3

Swift 4 JSONto Classwith Decodable- dành cho những người thích các lớp học

Xác định các lớp như sau:

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
}

Cách sử dụng, khá trừu tượng:

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

Điều này cho phép các phương thức cho cả PeoplePerson các lớp, các biến (thuộc tính) và các phương thức cũng có thể được đánh dấu là privatenếu cần.


2

Cập nhật cho Swift 3 một cách an toàn nhất

    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)
        }
    }
}

nhập mô tả hình ảnh ở đây


2

Các mã sau đây làm việc cho tôi. Tôi đang sử dụng Swift 5

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

Sau đó, nếu Person Struct (hoặc Class) của bạn là Decodable (và cả tất cả các thuộc tính của nó), bạn chỉ cần làm:

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

Tôi tránh tất cả các mã xử lý lỗi để làm cho mã dễ đọc hơn.


1

Dựa trên câu trả lời của Abhishek , đối với iOS 8, đây sẽ là:

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

Bạn đang sử dụng Swift 2.0? Sau đó, có, đó sẽ là trường hợp. Điều này đã được trả lời trước 2.0.
David Poxon

1

Điều này làm việc với tôi với 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)
        }
    }
}

1

Swift 4.1 Cập nhật Xcode 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
           }
 }

3
Không có gì mới, hoàn toàn ngược lại: Đừng sử dụng NSDatatrong Swift 3+ và .allowFragmentstrong trường hợp này là vô nghĩa.
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)")
    }
}


1

Swift 5.1, Xcode 11

Bạn có thể sử dụng điều này:


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(Class.self, from: data)
   else {
        return nil
   }

   return person
}

0

Tôi đã sử dụng mã dưới đây để tìm nạp JSON từ tệp FAQ-data.json có trong thư mục dự án.

Tôi đang triển khai trong Xcode 7.3 bằng 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()
    }

Cấu trúc của tệp 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
            }
            . . .
        ]
    }
}

0

Tôi cũng có thể đề xuất Hướng dẫn Swift JSON của Ray Wenderlich (cũng bao gồm thay thế SwiftyJSON tuyệt vời, Gloss ). Một đoạn trích (được cấp, tự nó, không trả lời đầy đủ cho người đăng, nhưng giá trị gia tăng của câu trả lời này là liên kết, vì vậy không có -1 cho điều đó, xin vui lòng):

Trong Objective-C, phân tích cú pháp và giải tuần tự JSON khá đơn giản:

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

Trong Swift, phân tích cú pháp và giải nén JSON hơi tẻ nhạt hơn một chút do các tùy chọn Swift và loại an toàn [nhưng là một phần của Swift 2.0, guardcâu lệnh được đưa ra để giúp loại bỏ các ifcâu lệnh lồng nhau :

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)")

Tất nhiên, trong XCode 8.x, bạn chỉ cần nhấn đúp vào thanh dấu cách và nói "Hey, Siri, vui lòng giải thích lại JSON này cho tôi trong Swift 3.0 với dấu cách / dấu cách."


0

PHIÊN BẢN SWIFTYJSON 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
}

0

Đầu tiên tạo một mã hóa Struc như thế này:

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

Bây giờ khai báo biến

 var jzdosList = [JuzgadosList]()

Đọc từ thư mục chính

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.")
        }
    }

Đọc từ trang 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()
    }

0

Sử dụng chức năng chung này

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
}

với dòng mã này:

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

cho loại này:

struct Model: Codable {
    let tall: Int
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.