स्विफ्ट में 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)
}

स्विफ्ट 1

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
मैं आपके सवाल को नहीं समझता। क्या घुंघराले कोष्ठक? आपने JSON में एक शब्दकोश को एन्कोडिंग के बारे में पूछा, और यह मेरा जवाब है।
एरिक आया

1
JSON घुंघराले कोष्ठक, जैसे{"result":[{"body":"Question 3"}] }
ओरखान अलीज़ादे

2
ऊपर कॉल करने के लिए @OrkhanAlizade dataWithJSONObject हैं जिसके परिणामस्वरूप के भाग के रूप "कर्ली कोष्ठक" (यानी ब्रेसिज़) का उत्पादन NSDataवस्तु।
रोब

धन्यवाद। साइड नोट - संक्षिप्त (dic) tionary के बजाय 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)")
    }
  }

एक नियमित स्विफ्ट स्ट्रिंग, JSONText घोषणा पर भी काम करता है।
फ्रेड फस्ट

@ विज्ञापन, आप NSData को सीधे स्विफ्ट स्ट्रिंग में कैसे परिवर्तित करते हैं? स्ट्रिंग रूपांतरण का डेटा NSString का एक कार्य है।
डंकन सी

मैं इस विधि को लागू कर रहा था और स्विफ्ट स्ट्रिंग पर डेटा / एन्कोडिंग का उपयोग करता था, मुझे यकीन नहीं है कि अगर स्विफ्ट 1.x पर उपलब्ध था।
फ्रेड फौस्ट

मेरा दिन बचाया। धन्यवाद।
शोभित C

चयनित उत्तर (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)
    }
}

यह समस्या को हल करने का एक अच्छा और पुन: प्रयोज्य तरीका है लेकिन थोड़ी व्याख्या से नए साथियों को इसे बेहतर तरीके से समझने में मदद मिलेगी।
22 सितंबर को nilobarp

क्या इसे लागू किया जा सकता है अगर शब्दकोश की कुंजियों में कस्टम ऑब्जेक्ट्स की सरणी हो?
राजू yourPepe

2
encoding: .asciiसार्वजनिक विस्तार में इसका उपयोग करना अच्छा नहीं है । .utf8ज्यादा सुरक्षित होगा!
ArtFeel

भागने के पात्रों के साथ यह प्रिंट कहीं भी है कि इसे रोकने के लिए?
MikeG

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
यहाँ कई गलतियाँ। क्यों स्विफ्ट के शब्दकोश के बजाय फाउंडेशन के NS सहार का उपयोग कर रहे हैं ?! इसके अलावा वास्तविक स्ट्रिंग JSON डेटा को वापस करने के बजाय स्ट्रिंग के साथ एक नया शब्दकोश मूल्य के रूप में क्यों दे रहा है? इसका कोई मतलब नहीं है। इसके अलावा अंतर्निहित अलिखित वैकल्पिक एक वैकल्पिक के रूप में लौटा है वास्तव में एक अच्छा विचार नहीं है।
एरिक आया
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.