কীভাবে জেএসএন ফাইল দ্রুতগতিতে পার্স করবেন?


90

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


4
এখানে একটি টিউটোরিয়াল রয়েছে যা একটি ইউআরএল অনুরোধ করে এবং ফলাফলটি একটি ইউআইটিবেল ভিউতে লোড করে
ক্রিস স্টোকস

আমি সুইফট 3: github.com/borchero/WebParsing
borchero

উত্তর:


101

আরও সহজ হতে পারে না:

import Foundation

let jsonData: Data = /* get your json data */
let jsonDict = try JSONSerialization.jsonObject(with: jsonData) as? NSDictionary

বলা হচ্ছে, আমি সুইফট 4-এ প্রবর্তিত কোডেবল এপিআইগুলি ব্যবহার করার দৃ .়ভাবে পরামর্শ দিচ্ছি


12
উদাহরণস্বরূপ,let jsonData = NSData.dataWithContentsOfFile(filepath, options: .DataReadingMappedIfSafe, error: nil)
ক্যারোলিন

4
এই পদ্ধতির সাথে সমস্যা হ'ল আপনি ফাউন্ডেশন অবজেক্টগুলির একটি গুচ্ছ দিয়ে শেষ করুন। যথা এনএসএসটিরিং, এনএসএনম্বার, এনএসআরাই, এনএসডি অভিধান বা এনএসএনল। আপনি যদি আপনার কোডটিতে পরে টাইপ করা নেটিভ সুইফ্টের সাথে ডিল করতে চান তবে এটি ডাউন কাস্টিং বোঝার হ্যাক তৈরি করে। বিশেষত যদি আপনার অভিধান এবং অ্যারে নেস্ট করা থাকে ra কেউ কীভাবে এটি মোকাবেলা করতে জানেন?
ক্যালিফর্চ

4
এই ধরণেরগুলি সুইফট এবং ওবজে-সি এর মধ্যে ব্রিজ করা হয়।
আকাশীবস্কিই

4
আইওএস 8.1 একটি ফাইল লোড করার সঠিক উপায় মনে করা হয়: NSData(contentsOfFile: path)বিকাশকারী.এপ্লে.লাইবারি /
ক্লড

7
@ বুবাকাজৌবা: করুণা আমি কোনও মন্তব্যকে কমিয়ে দিতে পারি না। কয়েকটি জিনিস: ১. ক্যারোলিন কোনও ফাইল থেকে ডেটা লোড করার জন্য ইতিমধ্যে একটি স্নিপেট সরবরাহ করেছিল (যা ওপি চেয়েছিল)। ২. আপনার কোডে ASCII এনকোডিং ব্যবহার করা হয়েছে যা ইংরাজী ভাষা সমর্থন সহ সকল ইউনিকোড প্রতীক হারিয়ে ফেলে।
আকাশীবস্কিই

43

এপিআই অনুরোধ করা হচ্ছে

var request: NSURLRequest = NSURLRequest(URL: url)
var connection: NSURLConnection = NSURLConnection(request: request, delegate: self, startImmediately: false)

প্রতিক্রিয়া জন্য প্রস্তুত

নীচে হিসাবে একটি অ্যারে ঘোষণা করুন

var data: NSMutableData = NSMutableData()

সাড়া পেয়েছি

ঘ।

func connection(didReceiveResponse: NSURLConnection!, didReceiveResponse response: NSURLResponse!) {
   // Received a new request, clear out the data object
   self.data = NSMutableData()
}

ঘ।

func connection(connection: NSURLConnection!, didReceiveData data: NSData!) {
   // Append the received chunk of data to our data object
   self.data.appendData(data)
}

ঘ।

func connectionDidFinishLoading(connection: NSURLConnection!) {
   // Request complete, self.data should now hold the resulting info
   // Convert the retrieved data in to an object through JSON deserialization
   var err: NSError
   var jsonResult: NSDictionary = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers, error: nil) as NSDictionary

   if jsonResult.count>0 && jsonResult["results"].count>0 {
      var results: NSArray = jsonResult["results"] as NSArray
      self.tableData = results
      self.appsTableView.reloadData()

   }
}

যখন NSURLConnectionকোনও প্রতিক্রিয়া পাওয়া যায়, আমরা didReceiveResponseআমাদের পক্ষ থেকে পদ্ধতিটি কল করার আশা করতে পারি । এই মুহুর্তে আমরা self.data = NSMutableData()খালি একটি নতুন খালি ডেটা অবজেক্ট তৈরি করে এই বলে আমাদের ডেটা পুনরায় সেট করি ।

কোনও সংযোগ তৈরি হওয়ার পরে, আমরা পদ্ধতিতে ডেটা নেওয়া শুরু করব didReceiveData। এখানে যে সমস্ত ডেটা যুক্তিটি দেওয়া হচ্ছে তা হ'ল আমাদের সমস্ত সরস তথ্য। আমাদের আসা প্রতিটি খণ্ডকে আমাদের ধরে রাখতে হবে, তাই আমরা এটিকে স্বতঃ ডেটা অবজেক্টে যুক্ত করব যা আমরা আগে পরিষ্কার করেছি।

পরিশেষে, সংযোগটি শেষ হয়ে গেলে এবং সমস্ত ডেটা প্রাপ্ত হয়ে গেলে, connectionDidFinishLoadingতাকে ডাকা হয় এবং আমরা আমাদের অ্যাপ্লিকেশনটিতে ডেটা ব্যবহার করতে প্রস্তুত। হুররে!

connectionDidFinishLoadingপদ্ধতি এখানে ব্যবহার NSJSONSerializationউপযোগী করার জন্য আমাদের কাঁচা ডেটা রূপান্তর করতে বর্গ Dictionaryআপনার URL থেকে ফলাফল deserializing দ্বারা বস্তু।


19

আমি সবে JSON নামক একটি ক্লাস লিখেছি, যা JSON কে ES5 এ JSON অবজেক্টের মত সুইফটে পরিচালনা করতে সহজ করে তোলে।

আপনার সুইফট অবজেক্টটি এর মতো জেএসএনে পরিণত করুন:

let obj:[String:AnyObject] = [
    "array": [JSON.null, false, 0, "",[],[:]],
    "object":[
        "null":   JSON.null,
        "bool":   true,
        "int":    42,
        "double": 3.141592653589793,
        "string": "a α\t弾\n𪚲",
        "array":  [],
        "object": [:]
    ],
    "url":"http://blog.livedoor.com/dankogai/"
]

let json = JSON(obj)
json.toString()

... বা স্ট্রিং ...

let json = JSON.parse("{\"array\":[...}")

... বা ইউআরএল।

let json = JSON.fromURL("http://api.dan.co.jp/jsonenv")
Tree Traversal

সাবস্ক্রিপ্টের মাধ্যমে কেবল উপাদানগুলি ট্র্যাভার করুন:

json["object"]["null"].asNull       // NSNull()
// ...
json["object"]["string"].asString   // "a α\t弾\n𪚲"
json["array"][0].asNull             // NSNull()
json["array"][1].asBool             // false
// ...

SwiftyJSON এর মতো আপনি সাবস্ক্রিপড এন্ট্রি উপস্থিত না থাকলে আপনি চিন্তা করবেন না।

if let b = json["noexistent"][1234567890]["entry"].asBool {
    // ....
} else {
    let e = json["noexistent"][1234567890]["entry"].asError
    println(e)
}

আপনি যদি সাবস্ক্রিপ্টগুলিতে ক্লান্ত হয়ে থাকেন তবে আপনার স্কিমটি এর মতো যুক্ত করুন:

//// schema by subclassing
class MyJSON : JSON {
    init(_ obj:AnyObject){ super.init(obj) }
    init(_ json:JSON)  { super.init(json) }
    var null  :NSNull? { return self["null"].asNull }
    var bool  :Bool?   { return self["bool"].asBool }
    var int   :Int?    { return self["int"].asInt }
    var double:Double? { return self["double"].asDouble }
    var string:String? { return self["string"].asString }
}

এবং আপনি যান:

let myjson = MyJSON(obj)
myjson.object.null
myjson.object.bool
myjson.object.int
myjson.object.double
myjson.object.string
// ...

আশা করি এটা আপনার ভালো লেগেছে.

নতুন এক্সকোড 7.3+ এর সাথে আপনার ডোমেনটিকে ব্যতিক্রম তালিকায় যুক্ত করা গুরুত্বপূর্ণ ( আমি কীভাবে আমার তথ্য.প্লেস্ট ফাইলটিতে এনএসএপিটান্সপোর্টসিকিউরিটি যুক্ত করতে পারি? ), নির্দেশাবলীর জন্য এই পোস্টিংটি পড়ুন, অন্যথায় আপনি পরিবহন কর্তৃপক্ষের ত্রুটি পাবেন।


আপনার গিথুব রেপো সম্পর্কিত একটি প্রশ্ন: আপনি কীভাবে মেইন.সুইফ্টকে কার্যকর করেন? খেলার মাঠের মধ্যে থেকে এটি সম্পাদন করতে আমার সমস্যা হচ্ছে কারণ আপনি খেলার মাঠ (?!) থেকে আপনার নিজস্ব প্রকল্পে সংজ্ঞায়িত ক্লাসগুলি উল্লেখ করছেন বলে মনে হচ্ছে না!
জানোস

আমি সর্বশেষতম রেপোগুলিতে সর্বজনীন পদ্ধতিগুলিকে চিহ্নিত করেছি। এটি বিটা 4-তে সর্বনিম্ন প্রয়োজনীয়তা তৈরি করে তাই Xcode আপগ্রেড করতে ভুলবেন না চেষ্টা করার আগে
dankogai

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

আমি এটি কাজ করতে পারি না :( এবার আমি এটি খেলার মাঠে ব্যবহার করার চেষ্টা করছি না, আমি আপনার প্রকল্পে আপনার json.swift যুক্ত করেছি এবং অন্য শ্রেণিতে আমি এটি ব্যবহার করার চেষ্টা করছি It এটি কার্যকর হয় না। আমি সহজতম জেএসএন চেষ্টা করেছি: {"আইডি": "জ্যানোস"}, জেএসওএন অবজেক্ট তৈরি করেছে, এটির স্ট্রিং পদ্ধতি বলে, এটি ফাইলের বিষয়বস্তু সঠিকভাবে ছুঁড়ে ফেলেছে, তবে আমি যখন আমার জেএসনকে "" আইডি "] কল করি, তখনই আমি নিরস্ত হই। আমি কী মিস করছি?
জানোস

আমি কনস্ট্রাক্টারে একটি স্ট্রিং পাস করে একটি JSON অবজেক্ট তৈরির চেষ্টা করছিলাম ... আমি উদাহরণে আপনি কীভাবে পরিবর্তন করেছেন এখন এটি ট্রিট কাজ করে। শুধু প্রশ্ন যা এক এখন পুলিশের বা SwiftyJSon :) ব্যবহার করা
জেনোস

4

JSON এবং NSData এর মধ্যে সুইফট ২.০ তে রূপান্তর করতে এখানে একটি কোড রয়েছে

// Convert from NSData to json object
func nsdataToJSON(data: NSData) -> AnyObject? {
    do {
        return try NSJSONSerialization.JSONObjectWithData(data, options: .MutableContainers)
    } catch let myJSONError {
        print(myJSONError)
    }
    return nil
}

// Convert from JSON to nsdata
func jsonToNSData(json: AnyObject) -> NSData?{
    do {
        return try NSJSONSerialization.dataWithJSONObject(json, options: NSJSONWritingOptions.PrettyPrinted)
    } catch let myJSONError {
        print(myJSONError)
    }
    return nil;
}

3

কোডড

সুইফটে 4+ এর Codableপরিবর্তে ব্যবহারের জন্য দৃ recommended়ভাবে সুপারিশ করা হয় JSONSerialization

এর Codableমধ্যে দুটি প্রোটোকল রয়েছে: Decodableএবং Encodable। এই Decodableপ্রোটোকলটি আপনাকে DataJSON ফর্ম্যাটে কাস্টম স্ট্রাক্ট / শ্রেণিতে এই প্রোটোকলের সাথে মানিয়ে নেওয়ার অনুমতি দেয়।

উদাহরণস্বরূপ পরিস্থিতিটি কল্পনা করুন যে আমাদের এই সাধারণ Data(দুটি বস্তুর অ্যারে) রয়েছে

let data = Data("""
[
    {"name":"Steve","age":56}, 
    {"name":"iPhone","age":11}
]
""".utf8)

তারপরে structপ্রোটোকলটি অনুসরণ এবং প্রয়োগ করুনDecodable

struct Person: Decodable {
    let name: String
    let age: Int
}

এখন আপনি যেখানে Dataআপনার পরামিতিটি টাইপ Personকরছেন তা ব্যবহার করে আপনার অ্যারেতে ডিকোড করতে পারেন এবং এই ধরণের ডিকোড করা উচিতJSONDecoderDecodableData

do {
    let people = try JSONDecoder().decode([Person].self, from: data)
} catch { print(error) }

... নোট করুন কী tryকীওয়ার্ড দিয়ে ডিকোডিং চিহ্নিত করতে হবে যেহেতু উদাহরণস্বরূপ আপনি নামকরণের ক্ষেত্রে কিছু ভুল করতে পারেন এবং তারপরে আপনার মডেলটি সঠিকভাবে ডিকোড করা যায় না ... সুতরাং আপনার এটি চেষ্টা-ধরা-ব্লকের ভিতরে রাখা উচিত


যেসকলগুলির মধ্যে জসন-এর কীগুলি সম্পত্তির নাম থেকে পৃথক:

  • কী তে snake_case ব্যবহার নামকরণ করা হয়, তাহলে আপনি এর ডিকোডার সেট করতে পারেন keyDecodingStrategyথেকে convertFromSnakeCaseথেকে পরিবর্তন যা চাবি property_nameক্যামেলকেস করতেpropertyName

    let decoder = JSONDecoder()
    decoder.keyDecodingStrategy = .convertFromSnakeCase
    let people = try decoder.decode([Person].self, from: data)
    
  • আপনার যদি অনন্য নামের প্রয়োজন হয় তবে আপনি স্ট্রাইক / শ্রেণীর ভিতরে কোডিং কীগুলি ব্যবহার করতে পারেন যেখানে আপনি কীটির নাম ঘোষণা করেন declare

    let data = Data(""" 
    { "userName":"Codable", "age": 1 } 
    """.utf8)
    
    struct Person: Decodable {
    
        let name: String
        let age: Int
    
        enum CodingKeys: String, CodingKey {
            case name = "userName"
            case age
        }
    }
    

2

আমি একটি ছোট লাইব্রেরিও লিখেছিলাম যা জেসন প্রতিক্রিয়াটিকে কোনও অবজেক্ট স্ট্রাকচারে ম্যাপিংয়ের জন্য বিশেষজ্ঞ is আমি অভ্যন্তরীণভাবে ডেভিড ওভেনস থেকে লাইব্রেরি জসন-সুইফ্ট ব্যবহার করছি। হতে পারে এটি অন্য কারও জন্য কার্যকর।

https://github.com/prine/ROJSONParser

উদাহরণ কর্মচারী.জসন son

{
"employees": [
  {
    "firstName": "John",
    "lastName": "Doe",
    "age": 26
  },
  {
    "firstName": "Anna",
    "lastName": "Smith",
    "age": 30
  },
  {
    "firstName": "Peter",
    "lastName": "Jones",
    "age": 45
  }]
}

পরবর্তী পদক্ষেপ হিসাবে আপনাকে আপনার ডেটা মডেল তৈরি করতে হবে (এমপ্লয়ি কনটেনার এবং কর্মচারী)।

কর্মচারী.সুইফ্ট

class Employee : ROJSONObject {

    required init() {
        super.init();
    }

    required init(jsonData:AnyObject) {
        super.init(jsonData: jsonData)
    }

    var firstname:String {
        return Value<String>.get(self, key: "firstName")
    }

    var lastname:String {
        return Value<String>.get(self, key: "lastName")            
    }

    var age:Int {
        return Value<Int>.get(self, key: "age")
    }
}

কর্মচারী কনটেনার.সুইফ্ট

class EmployeeContainer : ROJSONObject {
    required init() {
        super.init();
    }

    required init(jsonData:AnyObject) {
        super.init(jsonData: jsonData)
    }

    lazy var employees:[Employee] = {
        return Value<[Employee]>.getArray(self, key: "employees") as [Employee]
    }()
}

তারপরে JSON প্রতিক্রিয়া থেকে বস্তুগুলিকে প্রকৃতপক্ষে ম্যাপ করতে আপনার কেবলমাত্র কনস্ট্রাক্টরের প্যারাম হিসাবে কর্মচারী কনটেনার ক্লাসে ডেটা পাস করতে হবে। এটি স্বয়ংক্রিয়ভাবে আপনার ডেটা মডেল তৈরি করে।

 var baseWebservice:BaseWebservice = BaseWebservice();

  var urlToJSON = "http://prine.ch/employees.json"

  var callbackJSON = {(status:Int, employeeContainer:EmployeeContainer) -> () in
    for employee in employeeContainer.employees {
      println("Firstname: \(employee.firstname) Lastname: \(employee.lastname) age: \(employee.age)")
    }
  }

  baseWebservice.get(urlToJSON, callback:callbackJSON)

কনসোল আউটপুটটি নীচের মত দেখাচ্ছে:

Firstname: John Lastname: Doe age: 26
Firstname: Anna Lastname: Smith age: 30
Firstname: Peter Lastname: Jones age: 45

আপনি কি আমাকে অন্য একটি উদাহরণ দিয়ে ডেটা মডেল তৈরি করতে সহায়তা করতে পারেন @ প্রিনিন
দিলীপ তিওয়ারি

2

সুইফটজসন পার্স: জাসনকে খারাপের মতো পার্স করুন

মৃত-সহজ এবং পড়তে সহজ!

উদাহরণ: এই JSON প্রতিক্রিয়া থেকে একটি স্ট্রিং হিসাবে মানটি "mrap"পানnicknames

{
    "other": {
        "nicknames": ["mrap", "Mikee"]
}

এটি আপনার জসন ডেটা NSDataযেমন হয় তেমন প্রাকপ্রসেসের দরকার নেই।

let parser = JSONParser(jsonData)

if let handle = parser.getString("other.nicknames[0]") {
    // that's it!
}

দাবি অস্বীকার: আমি এটি তৈরি করেছি এবং আমি আশা করি এটি সকলকে সহায়তা করে। এটি উন্নত নির্দ্বিধায়!


আমার অজ্ঞতা ক্ষমা করুন। SwiftyJSON এর মতো একের উপরে আপনার লাইব্রেরিটি ব্যবহার করার সুবিধা কী কী?
লেবি রবার্টস

6
প্রাথমিকভাবে, আমি এটি তৈরি করেছি কারণ ভাষা হ্যাকিং অপারেটর / প্রতীকগুলির ধারণা আমার পছন্দ হয়নি। এছাড়াও আমি নিজেকে সুইফ্টের সাথে পরিচিত করার জন্য এটি তৈরি করেছি। কৌতূহলের বাইরে আমি একটি বেঞ্চমার্ক চালিয়েছি এবং সুইফটিজেএসনকে উচ্চতর গতি (~ 2 - 7 গুণ দ্রুত) পেয়েছি। আমি স্বীকার করতে রেপোর README আপডেট করেছি।
মাইক রাপাদাস

আপনার উত্তরের জন্য ধন্যবাদ.
লেভি রবার্টস

আপনি কীভাবে JSON থেকে ডেটার অ্যারে লোড করবেন (উদাহরণস্বরূপ লুপ সহ একাধিক আইটেম ...) কীভাবে উদাহরণ প্রদর্শন করতে পারেন
জোসেফ আস্ট্রাহান

2

সুইফটে জেএসএন পার্স করা কোড উত্পন্ন করার জন্য একটি দুর্দান্ত কাজ। আমি এটি করতে http://www.guideluxe.com/JsonToSwift এ একটি সরঞ্জাম তৈরি করেছি ।

আপনি একটি শ্রেণীর নাম সহ একটি নমুনা জেএসওএন অবজেক্ট সরবরাহ করেন এবং নমুনা জেএসওএন দ্বারা উল্লিখিত কাঠামোর প্রতিনিধিত্ব করতে এই সরঞ্জামটি একটি সম্পর্কিত সুইফ্ট শ্রেণি, পাশাপাশি প্রয়োজনীয় সহায়ক সহায়ক সুইফ্ট ক্লাস উত্পন্ন করবে। NSJSONSerialization.JSONObjectWithData পদ্ধতি ব্যবহার করে এমন একটি সহ সুইফট অবজেক্টগুলিকে জনিত করতে শ্রেণিবদ্ধ পদ্ধতিগুলি অন্তর্ভুক্ত রয়েছে। এনএসআরাই এবং এনএসডি অভিধানের প্রয়োজনীয় ম্যাপিংগুলি সরবরাহ করা হয়।

উত্পন্ন কোড থেকে আপনার কেবল জেএসওএন সমন্বিত একটি এনএসডিটা অবজেক্ট সরবরাহ করতে হবে যা সরঞ্জামটিতে সরবরাহ করা নমুনার সাথে মেলে।

ফাউন্ডেশন ব্যতীত, কোনও নির্ভরতা নেই।

আমার কাজটি http://json2csharp.com/ দ্বারা অনুপ্রাণিত হয়েছিল , যা। নেট প্রকল্পগুলির জন্য খুব কার্যকর।

একটি JSON ফাইল থেকে কীভাবে NSData অবজেক্ট তৈরি করবেন তা এখানে।

let fileUrl: NSURL = NSBundle.mainBundle().URLForResource("JsonFile", withExtension: "json")!
let jsonData: NSData = NSData(contentsOfURL: fileUrl)!

4
আপনি কি সমস্যা আছে?
পেরি ট্রাইবলেট 23

এর জন্য দুঃখিত, আমি সরাসরি জেএসএন ইউআরএল আটকানো ছিলাম, এটি জেএসএন প্রতিক্রিয়াটি পেস্ট করে ভালভাবে কাজ করে। ইউআরএল সরাসরি পেস্ট করা কল্পিত হবে। তবে এই ইউটিলিটির জন্য উজ্জ্বল কাজ। ধন্যবাদ
ioopl

আপনি যে সরঞ্জামটি তৈরি করেছেন তা কেবল দুর্দান্ত। আমি গত 6 মাস থেকে এই সরঞ্জামটি ব্যবহার করছি। তবে হঠাৎ গত 3 দিন থেকে আপনার ওয়েবসাইটটি অ্যাক্সেসযোগ্য নয় এবং ব্রাউজার এই বার্তাটিকে "এই সাইটে পৌঁছানো যায় না" দিয়ে সাড়া দিচ্ছে। তো, এর পেছনে কারণ কী?
সাইফ

2
  1. সুইফটি জসন ইনস্টল করুন

দ্রষ্টব্য: আপনি যদি এটি সন্ধান করে থাকেন তবে এমন একটি উচ্চ সম্ভাবনাও রয়েছে যা আপনি কীভাবে ইনস্টল করবেন জানেন না swiftyএখানে নির্দেশাবলী অনুসরণ করুন

sudo gem install cocoapods

cd ~/Path/To/Folder/Containing/ShowTracker

পরবর্তী এই আদেশটি প্রবেশ করান:

pod init

এটি Podfileআপনার প্রকল্পের জন্য একটি ডিফল্ট তৈরি করবে । Podfileযে দেশে আপনি সংজ্ঞায়িত আপনার প্রকল্পের উপর নির্ভর করে নির্ভরতা।

খোলার জন্য এই কমান্ড টাইপ করুন Podfileব্যবহার Xcodeসম্পাদনার জন্য:

open -a Xcode Podfile

যোগ Swiftypodfile মধ্যে

platform :ios, '8.0'
use_frameworks!

target 'MyApp' do
    pod 'SwiftyJSON', '~> X.X.X'
end
  1. এই উদাহরণটি পরীক্ষা করুন
var mURL = NSURL(string: "http://api.openweathermap.org/data/2.5/weather?q=London,uk&units=metric")

if mURL == nil{
    println("You are stupid")
    return
}

var request = NSURLRequest(URL: mURL!)

NSURLConnection.sendAsynchronousRequest(
    request,
    queue: NSOperationQueue.mainQueue(),
    completionHandler:{ (
        response: NSURLResponse!, 
        data: NSData!, 
        error: NSError!) -> Void in

    if data != nil {

        var mJSON = JSON(data: data!)

        if let current_conditions = mJSON["weather"][0]["description"].string {
            println("Current conditions: " + current_conditions)
        } else {
            println("MORON!")
        }

        if let current_temperature = mJSON["main"]["temp"].double {
            println("Temperature: "+ String(format:"%.f", current_temperature)  + "°C"
        } else {
            println("MORON!")
        }
    }
})

1

পুরো ভিউকন্ট্রোলার যা জেসন পার্সিগের দুটি পদ্ধতি ব্যবহার করে সংগ্রহ ভিউতে ডেটা দেখায়

@IBOutlet weak var imagecollectionview: UICollectionView!
lazy var data = NSMutableData()
var dictdata : NSMutableDictionary = NSMutableDictionary()
override func viewDidLoad() {
    super.viewDidLoad()
    startConnection()
    startNewConnection()
    // Do any additional setup after loading the view, typically from a nib.
}


func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
    return dictdata.count
}
func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {

    let cell  = collectionView.dequeueReusableCellWithReuseIdentifier("CustomcellCollectionViewCell", forIndexPath: indexPath) as! CustomcellCollectionViewCell
    cell.name.text = dictdata.valueForKey("Data")?.valueForKey("location") as? String
    let url = NSURL(string: (dictdata.valueForKey("Data")?.valueForKey("avatar_url") as? String)! )

    LazyImage.showForImageView(cell.image, url:"URL
    return cell
}
func collectionView(collectionView: UICollectionView,
                    layout collectionViewLayout: UICollectionViewLayout,
                           sizeForItemAtIndexPath indexPath: NSIndexPath) -> CGSize {
    let kWhateverHeightYouWant = 100
    return CGSizeMake(self.view.bounds.size.width/2, CGFloat(kWhateverHeightYouWant))
}

func startNewConnection()
{

   let url: URL = URL(string: "YOUR URL" as String)!
    let session = URLSession.shared

    let request = NSMutableURLRequest(url: url as URL)
    request.httpMethod = "GET" //set the get or post according to your request

    //        request.cachePolicy = NSURLRequest.CachePolicy.ReloadIgnoringCacheData
    request.cachePolicy = NSURLRequest.CachePolicy.reloadIgnoringCacheData

    let task = session.dataTask(with: request as URLRequest) {
        ( data, response, error) in

        guard let _:NSData = data as NSData?, let _:URLResponse = response, error == nil else {
            print("error")
            return
        }

       let jsonString = NSString(data: data!, encoding:String.Encoding.utf8.rawValue) as! String
               }
    task.resume()

}

func startConnection(){
    let urlPath: String = "your URL"
    let url: NSURL = NSURL(string: urlPath)!
    var request: NSURLRequest = NSURLRequest(URL: url)
    var connection: NSURLConnection = NSURLConnection(request: request, delegate: self, startImmediately: false)!
    connection.start()
}

func connection(connection: NSURLConnection!, didReceiveData data: NSData!){
    self.data.appendData(data)
}

func buttonAction(sender: UIButton!){
    startConnection()
}

func connectionDidFinishLoading(connection: NSURLConnection!) {
    do {
        let JSON = try NSJSONSerialization.JSONObjectWithData(self.data, options:NSJSONReadingOptions(rawValue: 0))
        guard let JSONDictionary :NSDictionary = JSON as? NSDictionary else {
            print("Not a Dictionary")
            // put in function
            return
        }
        print("JSONDictionary! \(JSONDictionary)")
        dictdata.setObject(JSONDictionary, forKey: "Data")

        imagecollectionview.reloadData()
    }
    catch let JSONError as NSError {
        print("\(JSONError)")
    }    }

1

অবজেক্টম্যাপার ফ্রেমওয়ার্ক ব্যবহার করে

if let path = Bundle(for: BPPView.self).path(forResource: jsonFileName, ofType: "json") {
    do {
        let data = try Data(contentsOf: URL(fileURLWithPath: path), options: NSData.ReadingOptions.mappedIfSafe)
        let json = try JSONSerialization.jsonObject(with: data, options: .allowFragments)
        self.levels = Mapper<Level>().mapArray(JSONArray: (json as! [[String : Any]]))!
        print(levels.count)
    } catch let error as NSError {
        print(error.localizedDescription)
    }
} else {
    print("Invalid filename/path.")
}

আপনার উপযুক্তের সেট প্রস্তুত করার আগে: ম্যাপেবল অবজেক্টগুলিকে পার্স করতে হবে

import UIKit 
import ObjectMapper
class Level: Mappable {
var levelName = ""
var levelItems = [LevelItem]()

required init?(map: Map) {

}

// Mappable
func mapping(map: Map) {
    levelName <- map["levelName"]
    levelItems <- map["levelItems"]
}

 import UIKit 
import ObjectMapper 
class LevelItem: Mappable {
var frontBackSide = BPPFrontBack.Undefined
var fullImageName = ""
var fullImageSelectedName = ""
var bodyParts = [BodyPart]()

required init?(map: Map) {

}

// Mappable
func mapping(map: Map) {
    frontBackSide <- map["frontBackSide"]
    fullImageName <- map["fullImageName"]
    fullImageSelectedName <- map["fullImageSelectedName"]
    bodyParts <- map["bodyParts"]
}}

1

সুইফট 3

let parsedResult: [String: AnyObject]
do {      
    parsedResult = try JSONSerialization.jsonObject(with: data, options: .allowFragments) as! [String:AnyObject]       
} catch {        
    // Display an error or return or whatever
}

ডেটা - এটি ডেটা টাইপ (স্ট্রাকচার) (যেমন কিছু সার্ভারের প্রতিক্রিয়া দ্বারা ফিরে এসেছে)


0

এই পার্সারটি JSON কে সুইফট প্রকারে কাস্ট করতে জেনেরিক ব্যবহার করে যা আপনার টাইপ করার কোডটি হ্রাস করে।

https://github.com/evgenyneu/JsonSwferson

struct Person {
  let name: String?
  let age: Int?
}

let mapper = JsonSwiftson(json: "{ \"name\": \"Peter\", \"age\": 41 }")

let person: Person? = Person(
  name: mapper["name"].map(),
  age: mapper["age"].map()
)

0

নীচে একটি সুইফ্ট খেলার মাঠ উদাহরণ:

import UIKit

let jsonString = "{\"name\": \"John Doe\", \"phone\":123456}"

let data = jsonString.data(using: .utf8)

var jsonObject: Any
do {
    jsonObject = try JSONSerialization.jsonObject(with: data!) as Any

    if let obj = jsonObject as? NSDictionary {
        print(obj["name"])
    }
} catch {
    print("error")
}

0

সুইফট 4

একটি প্রকল্প তৈরি করুন

একটি বোতাম এবং একটি ইউআইটিবেল ভিউ সহ স্টোরিবোর্ড ডিজাইন করুন

টেবিলভিউসেল ভিসি তৈরি করুন

বোতাম অ্যাকশনে ফলোয়িং কোডগুলি সন্নিবেশ করান

একটি এপিতে ডেটা আনার জন্য এই কোডটি মনে রাখবেন

import UIKit

class ViewController3: UIViewController,UITableViewDelegate,UITableViewDataSource {

    @IBOutlet var tableView: UITableView!
    var displayDatasssss = [displyDataClass]()
    override func viewDidLoad() {
        super.viewDidLoad()

        // Do any additional setup after loading the view.
    }
    func numberOfSections(in tableView: UITableView) -> Int {
        return 1
    }
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return displayDatasssss.count
    }
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "TableViewCell1") as! TableViewCell1
        cell.label1.text = displayDatasssss[indexPath.row].email
        return cell
    }
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    @IBAction func gettt(_ sender: Any) {

        let url = "http://jsonplaceholder.typicode.com/users"
        var request = URLRequest(url: URL(string: url)!)
        request.httpMethod = "GET"
        let configuration = URLSessionConfiguration.default
        let session = URLSession(configuration: configuration, delegate: nil, delegateQueue: OperationQueue.main)
        let task = session.dataTask(with: request){(data, response,error)in
            if (error != nil){
                print("Error")
            }
            else{
                do{
                    // Array of Data 
                    let fetchData = try JSONSerialization.jsonObject(with: data!, options: .mutableLeaves) as! NSArray

                    for eachData in fetchData {

                        let eachdataitem = eachData as! [String : Any]
                        let name = eachdataitem["name"]as! String
                        let username = eachdataitem["username"]as! String

                        let email = eachdataitem["email"]as! String
                         self.displayDatasssss.append(displyDataClass(name: name, username: username,email : email))
                    }
                    self.tableView.reloadData()
                }
                catch{
                    print("Error 2")
                }

            }
        }
        task.resume()

    }
}
class displyDataClass {
    var name : String
    var username : String
    var email : String

    init(name : String,username : String,email :String) {
        self.name = name
        self.username = username
        self.email = email
    }
}

এটি অভিধানের ডেটা আনার জন্য

import UIKit

class ViewController3: UIViewController,UITableViewDelegate,UITableViewDataSource {

    @IBOutlet var tableView: UITableView!
    var displayDatasssss = [displyDataClass]()
    override func viewDidLoad() {
        super.viewDidLoad()

        // Do any additional setup after loading the view.
    }
    func numberOfSections(in tableView: UITableView) -> Int {
        return 1
    }
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return displayDatasssss.count
    }
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "TableViewCell1") as! TableViewCell1
        cell.label1.text = displayDatasssss[indexPath.row].email
        return cell
    }
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    @IBAction func gettt(_ sender: Any) {

        let url = "http://jsonplaceholder.typicode.com/users/1"
        var request = URLRequest(url: URL(string: url)!)
        request.httpMethod = "GET"
        let configuration = URLSessionConfiguration.default
        let session = URLSession(configuration: configuration, delegate: nil, delegateQueue: OperationQueue.main)
        let task = session.dataTask(with: request){(data, response,error)in
            if (error != nil){
                print("Error")
            }
            else{
                do{
                    //Dictionary data Fetching
                    let fetchData = try JSONSerialization.jsonObject(with: data!, options: .mutableLeaves) as! [String: AnyObject]
                        let name = fetchData["name"]as! String
                        let username = fetchData["username"]as! String

                        let email = fetchData["email"]as! String
                         self.displayDatasssss.append(displyDataClass(name: name, username: username,email : email))

                    self.tableView.reloadData()
                }
                catch{
                    print("Error 2")
                }

            }
        }
        task.resume()

    }
}
class displyDataClass {
    var name : String
    var username : String
    var email : String

    init(name : String,username : String,email :String) {
        self.name = name
        self.username = username
        self.email = email
    }
}

0

সুইফট 4 এপিআই অনুরোধের উদাহরণ

ব্যবহার করা JSONDecoder().decode

এই ভিডিওটি দেখুন JSON সুইফট 4 দিয়ে পার্সিং করছে


struct Post: Codable {
    let userId: Int
    let id: Int
    let title: String
    let body: String
}

URLSession.shared.dataTask(with: URL(string: "https://jsonplaceholder.typicode.com/posts")!) { (data, response, error) in

    guard let response = response as? HTTPURLResponse else {
        print("HTTPURLResponse error")
        return
    }

    guard 200 ... 299 ~= response.statusCode else {
        print("Status Code error \(response.statusCode)")
        return
    }

    guard let data = data else {
        print("No Data")
        return
    }

    let posts = try! JSONDecoder().decode([Post].self, from: data)
    print(posts)      
}.resume()

0

সুইফট 2 আইওএস 9

let miadata = NSData(contentsOfURL: NSURL(string: "https://myWeb....php")!)

do{
    let MyData = try NSJSONSerialization.JSONObjectWithData(miadata!, options: NSJSONReadingOptions.MutableContainers) as? NSArray
    print(".........\(MyData)")    
}
catch let error as NSError{
    // error.description
    print(error.description)
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.