Swift를 사용하여 JSON 파일에서 읽기


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 객체에 넣을 수있는 방법에 대해 올바른 방향으로 밀어 줄 수 있다면 영원히 감사 할 것입니다!

감사합니다.

크리 벤츠.


1
오류 매개 변수를 사용하십시오 ...
Matthias Bauch

2
실제 컴파일 가능한 코드를 게시하십시오. 현재와 ​​같이 범위 path에서만 볼 수 있으며 if사용할 때 확인되지 않습니다 NSData(contentsOfFile, options, error). 열거 형 이름에 오타가 있습니다.
Kreiri

1
: 내 API는 완전히 스위프트 3 업데이트됩니다 github.com/borchero/WebParsing
borchero

이것은 키-> "값": "% load VALUE FROM tmclass.json file %"이고 파일에서 다른 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
            }
        }
     }
}

"persons"배열에는 핵심 인물에 대한 모든 데이터가 포함됩니다. 가져 오기 위해 반복합니다.

스위프트 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 Capture [4937 : 131932] *** catch되지 않은 예외 'NSInvalidArgumentException'으로 인해 응용 프로그램을 종료하는 이유 : '***- [_NSPlaceholderData initWithContentsOfFile : options : error :] : nil file argument '*** 첫 번째 던지기 호출 스택 : 이것이 왜 그런지에 대한 아이디어가 있습니까? jsonData 옵션의 경우 : (경로, 옵션 : NSDataReadingOptions.DataReadingMappedIfSafe, 오류 : nil)
Krivvenz

파일 경로가 올바르지 않습니다. Acually, 지정한 경로에 test.json이라는 파일이 없습니다. 파일의 정확한 위치를 확인하십시오
Abhishek

15
"let jsonData = NSData (contentsOfFile : path!)"대신 "let jsonData = NSData.dataWithContentsOfFile (경로, 옵션 : .DataReadingMappedIfSafe, 오류 : nil)"대신
tong

7
그러나이 운명의 피라미드 대신 가드 문을 사용하는 것이 좋습니다.
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과 카르타고로 바꾸었다! thanks :)
Paul Wand

나는 객체 매핑이
없다는

신속한 3에서 복사 붙여 넣기 오류를 피하려면 : NSData 및 NSError가 Data and Error가되었습니다.
selva

나는 몇 가지 다른 방법을 시도했는데 이것이 스위프트 3에서 가장
효과적이었다

(!) 맥 OS 10.6 이후 / 아이폰 OS 4는 API가 url(forResource있는 (NS)BundleURL을 생성하는 추가 단계를 피하기 위해
vadian

102

Decodable을 사용하는 Swift 4

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 답변 (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

스위프트 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")!


이것은 나를 위해 일했습니다. 검색 가능한 약물 목록을 앱에 하드 코딩해야했습니다. mySQL 데이터베이스에서 json 파일을 얻었습니다. json 파일을 viewDidLoad에서 실행중인 XCODE 프로젝트에 드롭하고 bam 내 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

스위프트 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
}

Decodable + 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

또한 fromJSONDecodable 확장명을 사용하지만 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

스위프트 사 JSONClassDecodable- 클래스를 선호하는 사람들을위한

다음과 같이 클래스를 정의하십시오.

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

이 두 방법 허용 PeoplePerson클래스 변수 (속성) 및 방법으로도 표시 할 private필요.


3

다음 코드는 저에게 효과적입니다. 내가 사용하고 스위프트 (5)

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

그런 다음 Person Struct (또는 Class)가 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

스위프트 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의 대답 , 아이폰 OS 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을 사용하고 있습니까? 그렇다면 그렇습니다. 이것은 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

스위프트 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
NSDataSwift 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

아래 코드를 사용 하여 project directory에있는 FAQ-data.json 파일에서 JSON가져 왔습니다.

Swift를 사용하여 Xcode 7.3에서 구현하고 있습니다.

     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

Ray Wenderlich의 Swift JSON Tutorial (SwiftyJSON 대안, Gloss 포함 ) 도 추천 할 수 있습니다 . 발췌 (그 자체로 부여 된 것은 포스터에 완전히 대답하지는 않지만이 답변의 부가 가치는 링크이므로 그에 대한 -1은 없습니다) :

Objective-C에서 JSON 구문 분석 및 직렬화 해제는 매우 간단합니다.

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

스위프트에서, 구문 분석 및 JSON을 역 직렬화하는 것은 좀 더 지루한 인해 스위프트 선택적 항목 및 유형 안전 [있지만 같은] 스위프트 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, Swift 3.0에서 공백 / 탭 들여 쓰기를 사용하여이 JSON을 직렬화 해제하십시오."라고 말합니다.


0

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

먼저 다음과 같이 코딩 가능한 Struc를 만듭니다.

  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.