সুইফটে অভিধানটি JSON এ রূপান্তর করুন


188

আমি পরবর্তী অভিধান তৈরি করেছি:

var postJSON = [ids[0]:answersArray[0], ids[1]:answersArray[1], ids[2]:answersArray[2]] as Dictionary

এবং আমি পেয়েছি:

[2: B, 1: A, 3: C]

সুতরাং, আমি কীভাবে এটি JSON এ রূপান্তর করতে পারি?


উত্তর:


240

সুইফট 3.0

সুইফট 3 এর সাথে, নাম NSJSONSerializationএবং এর পদ্ধতিগুলি পরিবর্তন হয়েছে, সুইফট এপিআই ডিজাইন গাইডলাইনস অনুসারে

let dic = ["2": "B", "1": "A", "3": "C"]

do {
    let jsonData = try JSONSerialization.data(withJSONObject: dic, options: .prettyPrinted)
    // here "jsonData" is the dictionary encoded in JSON data

    let decoded = try JSONSerialization.jsonObject(with: jsonData, options: [])
    // here "decoded" is of type `Any`, decoded from JSON data

    // you can now cast it with the right type        
    if let dictFromJSON = decoded as? [String:String] {
        // use dictFromJSON
    }
} catch {
    print(error.localizedDescription)
}

সুইফট 2.x

do {
    let jsonData = try NSJSONSerialization.dataWithJSONObject(dic, options: NSJSONWritingOptions.PrettyPrinted)
    // here "jsonData" is the dictionary encoded in JSON data

    let decoded = try NSJSONSerialization.JSONObjectWithData(jsonData, options: [])
    // here "decoded" is of type `AnyObject`, decoded from JSON data

    // you can now cast it with the right type 
    if let dictFromJSON = decoded as? [String:String] {
        // use dictFromJSON
    }
} catch let error as NSError {
    print(error)
}

সুইফট ঘ

var error: NSError?
if let jsonData = NSJSONSerialization.dataWithJSONObject(dic, options: NSJSONWritingOptions.PrettyPrinted, error: &error) {
    if error != nil {
        println(error)
    } else {
        // here "jsonData" is the dictionary encoded in JSON data
    }
}

if let decoded = NSJSONSerialization.JSONObjectWithData(jsonData, options: nil, error: &error) as? [String:String] {
    if error != nil {
        println(error)
    } else {
        // here "decoded" is the dictionary decoded from JSON data
    }
}


আমি পরের পেতে [2: A, 1: A, 3: A]। কিন্তু কোঁকড়া বন্ধনী সম্পর্কে কি?
অরখান আলিজাডে

1
আমি আপনার প্রশ্ন বুঝতে পারি না। কি কোঁকড়া বন্ধনী? আপনি জেএসএনে একটি অভিধান এনকোডিং সম্পর্কে জিজ্ঞাসা করেছিলেন, এবং এটি আমার উত্তর।
এরিক আয়া

1
জেএসএন কোঁকড়ানো বন্ধনীগুলি, যেমন{"result":[{"body":"Question 3"}] }
অরখান আলিজাড

2
উপরে কলে @OrkhanAlizade dataWithJSONObject হবে ফলে অংশ হিসেবে "কোঁকড়া বন্ধনী" (অর্থাত ধনুর্বন্ধনী) উত্পাদন NSDataঅবজেক্ট।
রব

ধন্যবাদ। পার্শ্ব নোট - সংক্ষিপ্ত (ডিক) টিউনারি পরিবর্তে d0 ব্যবহার করে বিবেচনা করুন।
জোহন্ডপোপ

165

আপনি একটি ভুল ধারণা করছেন। কেবলমাত্র ডিবাগার / খেলার মাঠটি আপনার অভিধানটি বর্গাকার বন্ধনীগুলিতে দেখায় (এটি কোকো অভিধানগুলি কীভাবে প্রদর্শন করে) এর অর্থ এই নয় যে এটি JSON আউটপুট ফর্ম্যাট করার উপায়।

এখানে উদাহরণ কোড রয়েছে যা স্ট্রিংয়ের একটি অভিধানকে JSON এ রূপান্তর করবে:

সুইফট 3 সংস্করণ:

import Foundation

let dictionary = ["aKey": "aValue", "anotherKey": "anotherValue"]
if let theJSONData = try? JSONSerialization.data(
    withJSONObject: dictionary,
    options: []) {
    let theJSONText = String(data: theJSONData,
                               encoding: .ascii)
    print("JSON string = \(theJSONText!)")
}

উপরেরগুলি "প্রিন্টেড প্রিন্টেড" ফর্ম্যাটে প্রদর্শিত করতে আপনি বিকল্প লাইনটি এতে পরিবর্তন করতে পারবেন:

    options: [.prettyPrinted]

বা সুইফট 2 সিনট্যাক্সে:

import Foundation
 
let dictionary = ["aKey": "aValue", "anotherKey": "anotherValue"]
let theJSONData = NSJSONSerialization.dataWithJSONObject(
  dictionary ,
  options: NSJSONWritingOptions(0),
  error: nil)
let theJSONText = NSString(data: theJSONData!,
  encoding: NSASCIIStringEncoding)
println("JSON string = \(theJSONText!)")

যে আউটপুট হয়

"JSON string = {"anotherKey":"anotherValue","aKey":"aValue"}"

বা সুন্দর বিন্যাসে:

{
  "anotherKey" : "anotherValue",
  "aKey" : "aValue"
}

অভিধানটি JSON আউটপুটে কোঁকড়া ধনুর্বন্ধনীতে আবদ্ধ রয়েছে, যেমনটি আপনি আশা করেছিলেন।

সম্পাদনা করুন:

সুইফ্ট 3/4 সিনট্যাক্সে, উপরের কোডটি এর মতো দেখাচ্ছে:

  let dictionary = ["aKey": "aValue", "anotherKey": "anotherValue"]
    if let theJSONData = try?  JSONSerialization.data(
      withJSONObject: dictionary,
      options: .prettyPrinted
      ),
      let theJSONText = String(data: theJSONData,
                               encoding: String.Encoding.ascii) {
          print("JSON string = \n\(theJSONText)")
    }
  }

একটি নিয়মিত সুইফ্ট স্ট্রিং জেএসএনটেক্সট ডিক্লোরেশনের পাশাপাশি কাজ করে।
ফ্রেড ফাউস্ট

@ থ্রিফ্রেডিলেট, আপনি কীভাবে এনএসডিটা সরাসরি সুইফ্ট স্ট্রিংয়ে রূপান্তর করবেন? স্ট্রিং রূপান্তরটিতে ডেটা এনএসএসস্ট্রিংয়ের একটি ক্রিয়া।
ডানকান সি

আমি এই পদ্ধতিটি বাস্তবায়ন করছিলাম এবং একটি সুইফ্ট স্ট্রিংয়ে ডেটা / এনকোডিং init ব্যবহার করেছি, আমি নিশ্চিত নই যে এটি সুইফট 1.x এ উপলব্ধ ছিল কিনা I'm
ফ্রেড ফাউস্ট

আমার দিন বাঁচিয়েছে ধন্যবাদ।
শোভিত সি

উত্তর নির্বাচন করা উচিত (y)
iBug

50

সুইফট 5:

let dic = ["2": "B", "1": "A", "3": "C"]
let encoder = JSONEncoder()
if let jsonData = try? encoder.encode(dic) {
    if let jsonString = String(data: jsonData, encoding: .utf8) {
        print(jsonString)
    }
}

নোট করুন কী এবং মানগুলি অবশ্যই প্রয়োগ করতে হবে Codable। স্ট্রিংস, ইনটস এবং ডাবলস (এবং আরও অনেক কিছু) ইতিমধ্যে রয়েছে Codable। দেখুন এনকোডিং ও ডিকোডিং কাস্টম প্রকারভেদ


26

আপনার প্রশ্নের উত্তর আমার নীচে

let dict = ["0": "ArrayObjectOne", "1": "ArrayObjecttwo", "2": "ArrayObjectThree"]

var error : NSError?

let jsonData = try! NSJSONSerialization.dataWithJSONObject(dict, options: NSJSONWritingOptions.PrettyPrinted)

let jsonString = NSString(data: jsonData, encoding: NSUTF8StringEncoding)! as String

print(jsonString)

উত্তর হল

{
  "0" : "ArrayObjectOne",
  "1" : "ArrayObjecttwo",
  "2" : "ArrayObjectThree"
}

24

সুইফট 4 Dictionaryএক্সটেনশন।

extension Dictionary {
    var jsonStringRepresentation: String? {
        guard let theJSONData = try? JSONSerialization.data(withJSONObject: self,
                                                            options: [.prettyPrinted]) else {
            return nil
        }

        return String(data: theJSONData, encoding: .ascii)
    }
}

সমস্যাটি সমাধানের এটি একটি ভাল এবং পুনঃব্যবহারযোগ্য উপায় তবে একটি সামান্য ব্যাখ্যা নতুন আগতদের আরও ভালভাবে বুঝতে সাহায্য করবে।
নিলোবার্প

অভিধানের কীগুলিতে কাস্টম অবজেক্টের অ্যারে থাকলে এটি প্রয়োগ করা যেতে পারে?
রাজু তোমার পেপে

2
encoding: .asciiজনসাধারণের বর্ধনে ব্যবহার করা ভাল ধারণা নয় । .utf8অনেক বেশি নিরাপদ হবে!
আর্টফিল

পালানোর চরিত্রগুলি সহ এই ছাপাগুলি এড়াতে কোথাও কি আছে?
মাইকেজি

23

কখনও কখনও এটি ডিবাগিং উদ্দেশ্যে সার্ভারের প্রতিক্রিয়া মুদ্রণ করা প্রয়োজন। আমি এখানে একটি ফাংশন ব্যবহার করছি:

extension Dictionary {

    var json: String {
        let invalidJson = "Not a valid JSON"
        do {
            let jsonData = try JSONSerialization.data(withJSONObject: self, options: .prettyPrinted)
            return String(bytes: jsonData, encoding: String.Encoding.utf8) ?? invalidJson
        } catch {
            return invalidJson
        }
    }

    func printJson() {
        print(json)
    }

}

ব্যবহারের উদাহরণ:

(lldb) po dictionary.printJson()
{
  "InviteId" : 2,
  "EventId" : 13591,
  "Messages" : [
    {
      "SenderUserId" : 9514,
      "MessageText" : "test",
      "RecipientUserId" : 9470
    },
    {
      "SenderUserId" : 9514,
      "MessageText" : "test",
      "RecipientUserId" : 9470
    }
  ],
  "TargetUserId" : 9470,
  "InvitedUsers" : [
    9470
  ],
  "InvitingUserId" : 9514,
  "WillGo" : true,
  "DateCreated" : "2016-08-24 14:01:08 +00:00"
}

10

সুইফট 3 :

let jsonData = try? JSONSerialization.data(withJSONObject: dict, options: [])
let jsonString = String(data: jsonData!, encoding: .utf8)!
print(jsonString)

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

5

আপনার প্রশ্নের উত্তর নীচে:

সুইফট 2.1

     do {
          if let postData : NSData = try NSJSONSerialization.dataWithJSONObject(dictDataToBeConverted, options: NSJSONWritingOptions.PrettyPrinted){

          let json = NSString(data: postData, encoding: NSUTF8StringEncoding)! as String
          print(json)}

        }
        catch {
           print(error)
        }

2

এটি করার জন্য এখানে একটি সহজ এক্সটেনশান:

https://gist.github.com/stevenojo/0cb8afcba721838b8dcb115b846727c3

extension Dictionary {
    func jsonString() -> NSString? {
        let jsonData = try? JSONSerialization.data(withJSONObject: self, options: [])
        guard jsonData != nil else {return nil}
        let jsonString = String(data: jsonData!, encoding: .utf8)
        guard jsonString != nil else {return nil}
        return jsonString! as NSString
    }

}

1
private func convertDictToJson(dict : NSDictionary) -> NSDictionary?
{
    var jsonDict : NSDictionary!

    do {
        let jsonData = try JSONSerialization.data(withJSONObject:dict, options:[])
        let jsonDataString = String(data: jsonData, encoding: String.Encoding.utf8)!
        print("Post Request Params : \(jsonDataString)")
        jsonDict = [ParameterKey : jsonDataString]
        return jsonDict
    } catch {
        print("JSON serialization failed:  \(error)")
        jsonDict = nil
    }
    return jsonDict
}

1
বেশ কয়েকটি ভুল এখানে। সুইফ্টের অভিধানের পরিবর্তে ফাউন্ডেশনের এনএসডিকোরিয়েশন কেন ব্যবহার করছেন ?! এছাড়াও আসল জেএসওন ডেটা ফেরানোর পরিবর্তে মান হিসাবে স্ট্রিং সহ একটি নতুন অভিধান কেন ফেরানো হচ্ছে? এটা কোন মানে নেই। এছাড়াও impচ্ছিক হিসাবে সুস্পষ্টভাবে মোড়কযুক্ত wচ্ছিকভাবে returnedচ্ছিকভাবে ফিরে আসা আসলে মোটেই ভাল ধারণা নয়।
এরিক আয়া
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.