การอ่านในไฟล์ JSON โดยใช้ Swift


205

ฉันกำลังดิ้นรนกับการพยายามอ่านไฟล์ JSON ใน Swift เพื่อให้ฉันสามารถเล่นกับมันได้ ฉันใช้เวลาส่วนที่ดีที่สุดในการค้นหาใหม่ 2 วันและลองใช้วิธีการที่แตกต่างกัน แต่ก็ยังไม่มีโชคดังนั้นฉันได้ลงทะเบียนกับ StackOverFlow เพื่อดูว่าใครสามารถชี้ให้ฉันไปในทิศทางที่ถูกต้อง .....

ไฟล์ JSON ของฉันชื่อ test.json และมีสิ่งต่อไปนี้:

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

ไฟล์ถูกเก็บไว้ในเอกสารโดยตรงและฉันเข้าถึงได้โดยใช้รหัสต่อไปนี้:

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

หากใครก็ตามสามารถผลักดันฉันในทิศทางที่ถูกต้องเกี่ยวกับวิธีที่ฉันสามารถยกเลิกการทำให้เป็นอันดับของไฟล์ JSON และวางไว้ในวัตถุ Swift ที่เข้าถึงได้ฉันจะขอบคุณตลอดไป!

ขอแสดงความนับถือ,

Krivvenz


1
ใช้พารามิเตอร์ข้อผิดพลาด ...
Matthias Bauch

2
กรุณาโพสต์รหัสจริงรวบรวมได้ ในฐานะที่เป็นก็คือตอนนี้pathสามารถมองเห็นได้เฉพาะในifขอบเขตและได้รับการแก้ไขเมื่อคุณใช้มันในNSData(contentsOfFile, options, error); คุณยังมีการพิมพ์ผิดในชื่อ enum
Kreiri

1
API ของฉันได้รับการอัปเดตอย่างสมบูรณ์สำหรับ Swift 3: github.com/borchero/WebParsing
borchero

นี่คือคีย์ -> "ค่า": "% ค่าโหลดจากไฟล์ tmclass.json%" และฉันต้องการแยก JSON อื่นจากไฟล์ดังนั้นฉันจะทำสิ่งนี้ได้อย่างไรใน SWIFT?
Mayur Shinde

คำตอบ:


287

ทำตามรหัสด้านล่าง:

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

อาร์เรย์ "บุคคล" จะมีข้อมูลทั้งหมดสำหรับบุคคลสำคัญ วนซ้ำเพื่อดึงข้อมูล

สวิฟท์ 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
มันจะมีประโยชน์มากขึ้นถ้าคุณอธิบายว่าทำไม / วิธีนี้แก้ปัญหาที่อธิบายไว้ในคำถามแทนที่จะเพียงแค่นำเสนอพวงของรหัส
Martin R

สวัสดี Abhishek - ขอบคุณสำหรับคำตอบของคุณ แต่ก็ยังไม่ทำงาน นั่นเป็นสาเหตุให้แอปพลิเคชันหยุดทำงานโดยมีข้อผิดพลาดด้านล่าง: 2014-06-25 16: 02: 04.146 การจับภาพ H & S [4937: 131932] *** แอปสิ้นสุดเนื่องจากข้อยกเว้นที่ไม่ถูกตรวจจับ 'NSInvalidArgumentException' เหตุผล: '*** - [_NSPlaceholderData initWithContentsOfFile: ตัวเลือก: ข้อผิดพลาด:]: อาร์กิวเมนต์ไฟล์ nil '*** โยนสายสแต็กแรก: แนวคิดใด ๆ ที่ทำให้เกิดปัญหานี้คืออะไร สำหรับตัวเลือก jsonData: ฉันใส่ (เส้นทางตัวเลือก: NSDataReadingOptions.DataReadingMappedIfSafe ข้อผิดพลาด: ไม่มี)
Krivvenz

เส้นทางไฟล์ของคุณไม่ถูกต้อง ที่จริงแล้วไม่มีไฟล์ชื่อ test.json ที่เส้นทางที่คุณระบุ โปรดตรวจสอบตำแหน่งที่ถูกต้องของไฟล์
Abhishek

15
"ให้ jsonData = NSData (contentsOfFile: เส้นทาง!)" แทน "ให้ jsonData = NSData.dataWithContentsOfFile (เส้นทางเลือก: .DataReadingMappedIfSafe ข้อผิดพลาด: ไม่มี)"
ทอง

7
ควรใช้คำสั่ง Guard else ที่นี่แทนการใช้พีระมิดแห่งการลงโทษ
Zonily Jame

140

หากใครกำลังมองหาSwiftyJSONคำตอบ:
อัปเดต:
สำหรับ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
นี่ทำให้ฉันกลายเป็น swiftyJSON และคาร์เธจ! ขอบคุณ :)
Paul Wand

ฉันใช้มันเพื่อค้นพบมันเท่านั้นการขาดการแมปวัตถุฉันจะลองใช้ไลบรารีอื่นในครั้งต่อไป
Elazaron

เพื่อหลีกเลี่ยงข้อผิดพลาดการคัดลอกวางใน swift 3: NSData และ NSError กลายเป็นข้อมูลและข้อผิดพลาด
selva

ฉันลองใช้วิธีที่ต่างกันสองสามข้อและวิธีนี้ใช้ได้ผลดีที่สุดสำหรับฉันใน Swift 3
crobicha

ตั้งแต่ MacOS 10.6 / iOS 4 (!) มี API url(forResourceใน(NS)Bundleการหลีกเลี่ยงขั้นตอนเพิ่มเติมในการสร้าง URL
vadian

102

Swift 4 โดยใช้ 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
}

สวิฟท์ 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
ควรย้ายไปที่คุณลักษณะเอกสารใหม่หรือทำเครื่องหมายว่าเป็นคำตอบที่ถูกต้อง
ระบบ

24

Xcode 8 Swift 3อ่าน json จากการอัปเดตไฟล์:

    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

อัปเดตชื่อสำหรับ Swift 3.0

ขึ้นอยู่กับคำตอบของ Abhishekและคำตอบของ 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

ทำให้ตัวอย่างง่ายขึ้นโดย Peter Kreinz ทำงานได้กับ Swift 4.2

ฟังก์ชั่นการขยาย:

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

รูปแบบตัวอย่าง:

struct Service: Decodable {
  let name: String
}

ตัวอย่างการใช้งาน:

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

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

// use output if all good

ตัวอย่างจะทำงานร่วมกับอาร์เรย์ด้วยเช่นกัน:

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

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

// use output if all good

สังเกตว่าเราไม่ได้ให้ยาชื่อสามัญใด ๆ ที่ไม่จำเป็นดังนั้นเราจึงไม่จำเป็นต้องแยกผลลัพธ์


10

Swift 2.1 answer (อิงจาก 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 {}
    }

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

เอาท์พุท:

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

7

มันใช้งานได้ดีกับฉัน

func readjson(fileName: String) -> NSData{

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

    return jsonData!
}

7

นี่คือทางออกของฉันโดยใช้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
}

👆🏻คัดลอกวางพร้อมโซลูชันอิสระของเฟรมเวิร์กของบุคคลที่สาม

การใช้งาน👇🏻

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


สิ่งนี้ใช้ได้สำหรับฉัน ฉันต้องการรหัสรายการยาที่สามารถค้นหาได้ยากในแอป ฉันได้รับไฟล์ json จากฐานข้อมูล mySQL ฉันส่งไฟล์ json ไปยังโปรเจ็กต์ XCODE ของฉันทำงานด้านบนใน viewDidLoad และแบมฉันมีพจนานุกรม json ของฉัน !!!
Brian

5

ฉันกำลังให้คำตอบอีกอันเนื่องจากไม่มีคำตอบใด ๆ ที่นี่สำหรับการโหลดทรัพยากรจากชุดทดสอบ หากคุณใช้บริการจากระยะไกลที่ใช้ JSON และต้องการทดสอบการแยกวิเคราะห์ผลลัพธ์โดยไม่ต้องกดปุ่มบริการจริงคุณจะต้องตอบกลับอย่างน้อยหนึ่งข้อและนำไปไว้ในไฟล์ในโฟลเดอร์ Tests ในโครงการของคุณ

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

สิ่งนี้ยังใช้SwiftyJSONแต่ตรรกะหลักของการรับชุดทดสอบและการโหลดไฟล์คือคำตอบสำหรับคำถาม


5

Swift 4:ลองใช้โซลูชันของฉัน:

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
}

อ่านได้ + 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)
    }
}

ตัวอย่าง:

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
fromJSONฟังก์ชั่นส่วนขยายของคุณพ่น แต่ในตัวอย่างที่คุณเรียกว่าไม่มีtryคำหลัก รหัสนี้จะไม่รวบรวม
NeverwinterMoon

นอกจากนี้สำหรับfromJSONคุณใช้ส่วนขยาย Decodable แต่คุณไม่ได้ใช้ข้อมูลใด ๆ จากประเภท Decodable แต่ให้ข้อมูลทั่วไป (ไร้ประโยชน์อย่างสมบูรณ์)
NeverwinterMoon

3

Swift 3.0 ล่าสุดใช้งานได้จริง

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- สำหรับผู้ที่ต้องการเรียน

กำหนดคลาสดังนี้:

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
}

การใช้งาน, บทคัดย่อสวย:

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

อนุญาตให้วิธีการสำหรับทั้งชั้นเรียนPeopleและPersonตัวแปร (คุณลักษณะ) และวิธีการนี้สามารถทำเครื่องหมายprivateว่าจำเป็นถ้า


3

รหัสต่อไปนี้ใช้งานได้สำหรับฉัน ฉันกำลังใช้Swift 5

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

จากนั้นถ้าโครงสร้างบุคคลของคุณ (หรือคลาส) เป็นDecodable (และคุณสมบัติทั้งหมดของมัน) คุณสามารถทำได้:

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

ฉันหลีกเลี่ยงรหัสการจัดการข้อผิดพลาดทั้งหมดเพื่อให้รหัสอ่านง่ายขึ้น


2

อัปเดตสำหรับ Swift 3ด้วยวิธีที่ปลอดภัยที่สุด

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

ป้อนคำอธิบายรูปภาพที่นี่


2

Swift 5.1, Xcode 11

คุณสามารถใช้สิ่งนี้:


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
}

1

ตามคำตอบของ Abhishekสำหรับ iOS 8 จะเป็นดังนี้:

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

คุณใช้ Swift 2.0 หรือไม่ ใช่แล้วนั่นเป็นกรณี นี่คือคำตอบ pre-2.0
David Poxon

1

สิ่งนี้ใช้ได้กับฉันด้วย 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 อัปเดต 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
ไม่มีอะไรใหม่ค่อนข้างตรงกันข้าม: อย่าใช้NSDataใน Swift 3+ และ.allowFragmentsไม่มีประโยชน์ในกรณีนี้
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)")
    }
}


0

ฉันใช้โค้ดด้านล่างเพื่อดึงข้อมูล JSONจาก FAQ-data.json ที่มีอยู่ในไดเรกทอรีโครงการ

ฉันใช้งาน Xcode 7.3 โดยใช้ 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()
    }

โครงสร้างของไฟล์ 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

ฉันอาจจะแนะนำSwift JSON Tutorialของ Ray Wenderlich (ซึ่งก็ครอบคลุมถึงทางเลือกที่น่าประทับใจ SwiftyJSON, Gloss ) ข้อความที่ตัดตอนมา (ซึ่งได้รับด้วยตัวเองไม่ได้ตอบผู้โพสต์อย่างเต็มที่ แต่มูลค่าเพิ่มของคำตอบนี้คือการเชื่อมโยงจึงไม่มี -1 สำหรับที่โปรด):

ใน Objective-C การแยกวิเคราะห์และ deserializing JSON นั้นค่อนข้างตรงไปตรงมา:

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

ใน Swift การแยกวิเคราะห์และ deserializing JSON นั้นน่าเบื่อกว่านี้เนื่องจากตัวเลือก Swift และประเภทความปลอดภัย [แต่เป็น] ส่วนหนึ่งของ Swift 2.0 guardคำสั่งนี้ได้รับการแนะนำเพื่อช่วยกำจัดifข้อความที่ซ้อนกัน:

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

แน่นอนใน XCode 8.x คุณเพียงแค่แตะสองครั้งที่แถบพื้นที่และพูดว่า "เฮ้ Siri โปรดกำจัด JSON นี้ให้ฉันด้วย Swift 3.0 ด้วยการเว้นวรรค / แท็บ"


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
}

0

ขั้นแรกสร้าง Struc codable เช่นนี้:

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

ตอนนี้ประกาศตัวแปร

 var jzdosList = [JuzgadosList]()

อ่านจากไดเรกทอรีหลัก

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

อ่านจากเว็บ

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

ใช้ฟังก์ชั่นทั่วไปนี้

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
}

ด้วยรหัสบรรทัดนี้:

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

สำหรับประเภทนี้:

struct Model: Codable {
    let tall: Int
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.