সুইফট ব্যবহার করে একটি জেএসওএন ফাইলে পড়া


205

আমি সুইফটে একটি JSON ফাইলটি পড়ার চেষ্টা করে সত্যিই লড়াই করছি যাতে আমি এটির সাথে খেলতে পারি। আমি 2 দিনের সেরা অংশটি পুনরায় অনুসন্ধান এবং বিভিন্ন পদ্ধতি ব্যবহার করে কাটিয়েছি তবে এখনও ভাগ্য হয়নি তাই কেউ আমাকে সঠিক দিকে নির্দেশ করতে পারে কিনা তা দেখার জন্য আমি স্ট্যাকওভারফ্লোতে সাইন আপ করেছি .....

আমার জেএসওএন ফাইলটিকে টেস্ট.জসন বলা হয় এবং এতে নিম্নলিখিতগুলি থাকে:

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

আমি যদি জেএসওএন ফাইলটিকে কীভাবে ডি-সিরিয়ালাইজ করতে পারি এবং এটি একটি অ্যাক্সেসযোগ্য সুইফট অবজেক্টে রাখতে পারি তার জন্য যদি কেউ আমাকে ঠিক দিকটিতে চাপ দিতে পারে তবে আমি চির কৃতজ্ঞ থাকব!

আন্তরিক শুভেচ্ছা,

Krivvenz।


1
ত্রুটি প্যারামিটারটি ব্যবহার করুন ...
ম্যাথিয়াস বাউচ

2
প্রকৃত, সংকলনযোগ্য কোড পোস্ট করুন। এটি এখন pathযেমন রয়েছে কেবলমাত্র ifস্কোপে দৃশ্যমান এবং যখন আপনি এটি ব্যবহার করেন তখন সমাধান করা যায় না NSData(contentsOfFile, options, error); এনাম নামে আপনার টাইপও রয়েছে।
ক্রেইরি

1
আমার এপিআই সম্পূর্ণরূপে সুইফট 3: github.com/borchero/WebParsing
borchero

এটি কী -> "মানগুলি": "tmclass.json ফাইল%" থেকে "% LOAD VALUE" এবং আমাকে ফাইল থেকে অন্য জেএসওনকে পার্স করতে হবে তবে আমি কীভাবে সুইফটে এটি অর্জন করতে পারি?
ময়ূর শিন্ডে

উত্তর:


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
যদি আপনি ব্যাখ্যা করেন তবে কেন / কীভাবে এটি সমস্যার সমাধান করে, কেবল কোডের একগুচ্ছ উপস্থাপনের পরিবর্তে প্রশ্নটিতে বর্ণিত সমস্যাটি সমাধান করে helpful
মার্টিন আর

হাই অভিষেক - আপনার উত্তরের জন্য ধন্যবাদ তবে এটি এখনও কার্যকর হয় না। এটি নীচের ত্রুটির সাথে অ্যাপ্লিকেশনটি ক্র্যাশ করে: 2014-06-25 16: 02: 04.146 এইচ এন্ড এস ক্যাপচার [4937: 131932] *** অপ্রয়োজনীয় ব্যতিক্রম 'এনএসআইডিয়ালিআরগমেন্টএক্সেপশন' এর কারণে অ্যাপ্লিকেশনটি সমাপ্ত করা হচ্ছে, কারণ: '*** - [_এনএসপ্লেসহোল্ডার ডেটা ইনিউইন্ট কনটেন্টস অফফাইলে: বিকল্পগুলি: ত্রুটি:]: নীল ফাইল আর্গুমেন্ট '*** প্রথমে কল স্ট্যাক নিক্ষেপ করুন: এটি কেন সম্পর্কে কোনও ধারণা? জসনডাটা বিকল্পগুলির জন্য: আমি (পথ, বিকল্পগুলি: এনএসডাটাআরেডিংঅ্যাপশনস.ডাটা রিয়েডিং ম্যাপেডআইফস্যাফ, ত্রুটি: শূন্য)
ক্রিভভেঞ্জ

আপনার ফাইলের পথটি সঠিক নয়। অবিচ্ছিন্নভাবে, আপনার দ্বারা নির্ধারিত পথে টেস্ট.জসন নামের কোনও ফাইল নেই। দয়া করে ফাইলটির সঠিক অবস্থানের জন্য যাচাই করুন
অভিষেক

15
"চলুন জসনডাটা = এনএসডিটা (বিষয়বস্তু অফফিল: পাথ!)" এর পরিবর্তে "লেটস জোনসোনডাটা = এনএসডাটা.ডাটা উইথসন্টেন্টস অফফাইলে (পথ, বিকল্পসমূহ: .ডাটাআরেডম্যাপেডআইফস্যাফ, ত্রুটি: শূন্য)"
টং

7
যদিও এখানে ডুমের পিরামিডের পরিবর্তে গার্ড অন্য বিবৃতি ব্যবহার করা ভাল।
জোনিলি জামে

140

যদি কেউ সুইফটিজেসন খুঁজছেন উত্তর:
আপডেট: এর
জন্য 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
এটি আমাকে সুইফটিজেএসন এবং কার্থেজের দিকে পরিণত করেছে! ধন্যবাদ :)
পল ওয়ান্ড

আমি এটি কেবলমাত্র আবিষ্কার করার জন্য এটিতে অবজেক্ট ম্যাপিংয়ের অভাব রয়েছে, আমি পরের বার একটি ভিন্ন গ্রন্থাগার চেষ্টা করব
এলাজারন

3 নম্বরে পেস্টের ত্রুটিটি এড়াতে: এনএসডাটা এবং এনএসইরর ডেটা এবং ত্রুটি হয়ে গেছে।
সেলভা 20

আমি কয়েকটি ভিন্ন পদ্ধতির চেষ্টা করেছি এবং এটি আমার পক্ষে সুইফট 3
ক্রোবিচা

যেহেতু MacOS 10.6 / iOS 4 (!) আছে ইউআরএল তৈরি করার অতিরিক্ত পদক্ষেপ এড়াতে একটি এপিআই url(forResourceরয়েছে(NS)Bundle
ভাদিয়ান

102

ডিকোডেবল ব্যবহার করে সুইফট 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

এক্সকোড 8 সুইফ্ট 3 ফাইল আপডেট থেকে জেসন পড়ুন:

    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

সুইফট 3.0 এর জন্য আপডেট হওয়া নাম

অভিষেকের উত্তর এবং দ্রুবার উত্তরের ভিত্তিতে

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

পিটার ক্রেইঞ্জ প্রদত্ত উদাহরণটিকে সরলকরণ। সুইফট ৪.২ নিয়ে কাজ করে।

এক্সটেনশন ফাংশন:

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

সুইফট ২.১ উত্তর (অভিষেকের উপর ভিত্তি করে):

    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, এক্সকোড 8, আইওএস 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")!


এটি আমার জন্য কাজ করেছে। আমার একটি অ্যাপ্লিকেশনটিতে ড্রাগগুলির অনুসন্ধানযোগ্য তালিকার হার্ড কোড দরকার। আমি মাইএসকিউএল ডাটাবেস থেকে জেসন ফাইল পেয়েছি। আমি আমার XCODE প্রজেক্টে জেসন ফাইলটি বাদ দিয়ে উপরে ভিডডিডলয়েডে চালাচ্ছি এবং আমার কাছে আমার জেসন অভিধান ছিল !!!
ব্রায়ান

5

আমি অন্য উত্তর সরবরাহ করছি কারণ এগুলির কোনওোটাই পরীক্ষার বান্ডেল থেকে সংস্থানটি লোড করার দিকে আগ্রহী নয়। আপনি যদি এমন কোনও দূরবর্তী পরিষেবা ব্যবহার করছেন যা জেএসওএনকে ফেলে রাখে এবং প্রকৃত পরিষেবাটি আঘাত না করে ফলাফলকে পার্সিংয়ের পরীক্ষার ইউনিট পরীক্ষা করতে চায়, আপনি এক বা একাধিক প্রতিক্রিয়া নিন এবং এগুলি আপনার প্রকল্পের টেস্ট ফোল্ডারে ফাইলগুলিতে রাখবেন।

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কীওয়ার্ড ছাড়াই এটি কল করেছেন । এই কোডটি সংকলন করবে না।
নেভারউইনটারমুন

এছাড়াও, fromJSONআপনি ডিকোডেবল এক্সটেনশন ব্যবহারের জন্য , তবুও আপনি ডিকোডেবল টাইপ থেকে কোনও তথ্য ব্যবহার করেন না তবে অতিরিক্ত (সম্পূর্ণ অকেজো) জেনেরিক সরবরাহ করেন।
নেভারউইনটারমুন

3

সর্বশেষতম সুইফট 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

সুইফট 4 JSONথেকে Classসঙ্গে 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প্রয়োজন হিসাবে চিহ্নিত করা যেতে পারে allow


3

নিম্নলিখিত কোডটি আমার পক্ষে কাজ করে। আমি সুইফট 5 ব্যবহার করছি

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

তারপরে, যদি আপনার ব্যক্তি কাঠামো (বা ক্লাস) ডিকোডেবল হয় (এবং এর সমস্ত বৈশিষ্ট্যও), আপনি কেবল পারেন:

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

কোডটি আরও সুস্পষ্ট করার জন্য আমি সমস্ত ত্রুটি পরিচালনার কোড এড়িয়ে গিয়েছি।


2

নিরাপদ উপায়ে সুইফট 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, এক্সকোড 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

অভিষেকের উত্তরের ভিত্তিতে , আইওএস 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

আপনি সুইফট ২.০ ব্যবহার করছেন? তাহলে হ্যাঁ, এটাই হবে। এটি উত্তর-পূর্ব 2.0।
ডেভিড পক্সন

1

এটি এক্সকোড 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

সুইফট ৪.১ আপডেট হয়েছে এক্সকোড ৯.২

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সুইফ্ট 3+ এ ব্যবহার করবেন না .allowFragmentsএবং এই ক্ষেত্রে অর্থহীন।
ভাদিয়ান

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

প্রকল্পের ডিরেক্টরিতে উপস্থিত FAQ-data.json ফাইল থেকে JSON আনার জন্য আমি নীচে কোড ব্যবহার করেছি ।

আমি এক্সকোড 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

আমিও রে Wenderlich এর সুপারিশ পারে সুইফট তাদেরকে JSON টিউটোরিয়াল (যা সন্ত্রস্ত SwiftyJSON বিকল্প, কভার টীকাটিপ্পনী )। একটি সংক্ষিপ্তসার (যা স্বতঃপ্রণোদিতভাবে পোস্টারটির পুরোপুরি উত্তর দেয় না, তবে এই উত্তরের যুক্ত হওয়া মূল্যটি হ'ল লিঙ্ক, সুতরাং এর জন্য নং -১ এর, দয়া করে):

অবজেক্টিভ-সি তে, জেএসওনকে পার্সিং এবং ডিজাইরিজাইজ করা মোটামুটি সোজা:

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

সুইফ্টে, জেএসএনকে পার্সিং এবং ডিসরিয়ালাইজিং করা সুইফ্ট বিকল্পগুলি এবং টাইপ-সুরক্ষার কারণে কিছুটা বেশি ক্লান্তিকর [তবে] সুইফট ২.০ এর অংশ হিসাবে 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)")

অবশ্যই, এক্সকোড ৮.x এ আপনি স্পেস বারটি ডাবল ট্যাপ করে বলছেন "আরে, সিরি, দয়া করে স্পেস / ট্যাব-ইন্ডেন্টগুলির সাহায্যে সুইফট ift.০ এ আমার জন্য এই জেএসওনকে ডিসিজায়ালাইজ করুন।"


0

সুইফটাইজসন ভার্সন সুইফট 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

প্রথমে এর মতো একটি স্ট্রোক কোডিং তৈরি করুন:

  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.