Swift'de JSON'a Sözlük Dönüştür

Bir sonraki sözlüğü oluşturdum:

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

ve ben elde ederim:

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

Peki, nasıl JSON'a dönüştürebilirim?

111
katma yazar Matthias Bauch, kaynak

8 cevap

Swift 3.0

Swift 3 ile NSJSONSerialization adı ve yöntemleri Swift API Tasarımına göre değişti. Kuralları .

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)
}

Swift 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)
}

Hızlı 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
    }
}

181
katma
Sonraki [2: A, 1: A, 3: A] 'ı aldım. Peki ya süslü parantezler?
katma yazar Orkhan Alizade, kaynak
JSON küme parantezleri, {"sonuç" gibi: [{"body": "Soru 3"}]}
katma yazar Orkhan Alizade, kaynak
Teşekkürler. yan not - yerine (dic) tionary d0 kullanarak düşünün.
katma yazar johndpope, kaynak
@OrkhanAlizade Yukarıdaki NSData </​​code> nesnesinin bir parçası olarak dataWithJSONObject "küme parantezlerini" (yani parantezleri) oluşturmak için yapılan çağrı.
katma yazar Rob, kaynak
wow, Swift 3 için ilk güncellemeyi takdir ediyor
katma yazar swiftBoy, kaynak
Sorunu anlamadım. Hangi küme parantezleri? JSON'da bir sözlüğü kodlamayı sordunuz ve bu benim cevabım.
katma yazar Moritz, kaynak

Yanlış bir varsayım yapıyorsun. Hata ayıklayıcı/Oyun Alanı, sözlüğünüzü köşeli parantez içinde gösterdiği için (ki bu, Kakao'nun sözlükleri nasıl görüntülediği), JSON çıktısının biçimlendirilme şekli anlamına gelmez.

Burada dizeleri bir dizgiyi JSON'a dönüştürecek örnek kod:

Swift 3 sürümü:

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!)")
}

Yukarıdakileri "güzel basılı" biçimde görüntülemek için seçenekler satırını şu şekilde değiştirirsiniz:

    options: [.prettyPrinted]

Ya da Swift 2 sözdizimi:

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!)")

Bunun çıktısı

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

Ya da güzel biçimde:

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

Sözlük, beklediğiniz gibi JSON çıktısında kaşlı ayraçlar içine alınır.

DÜZENLE:

Swift 3/4 sözdiziminde yukarıdaki kod şuna benzer:

  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)")
    }
  }
111
katma
@VyTcdc Cevabımda kodum? Yoksa bu OP için mi tasarlandı?
katma yazar Duncan C, kaynak
@thefredelement, NSData'yi bir Swift dizesine doğrudan nasıl dönüştürürsünüz? Dize dönüştürme veri NSString bir işlevidir.
katma yazar Duncan C, kaynak
cevap seçilmelidir (y)
katma yazar iBug, kaynak
Günümü kurtardım. Teşekkürler.
katma yazar Shobhit C, kaynak
Ne senin sorununun ne de senin kodun çok anlamlı değil.
katma yazar VyTcdc, kaynak
Düzenli Swift dizgisi, JSONText bildirimi üzerinde de çalışır.
katma yazar Fred Faust, kaynak
Bu yöntemi uyguluyordum ve Swift dizesinde veri/kodlama init kullanıyorum, Swift 1.x'de mevcut olup olmadığından emin değilim.
katma yazar Fred Faust, kaynak
doğru cevap bu;)
katma yazar Yura Buyaroff, kaynak

Sorunun cevabım aşağıda

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)

Cevap

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

Bazen sunucunun hata ayıklama amacıyla yanıtını yazdırmak gerekir. İşte kullandığım bir işlev:

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)
    }

}

Kullanım örneği:

(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"
}
17
katma

Swift 4:

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)
    }
}

Anahtar ve değerlerin Codable uygulamasını zorunlu kıldığını unutmayın. Dizeler, Ints ve Çiftler (ve daha fazlası) zaten Codable . Özel Türleri Kodlama ve Kod Çözme konusuna bakın.

14
katma

Swift 3:

let jsonData = try? JSONSerialization.data(withJSONObject: dict, options: [])
let jsonString = String(data: jsonData!, encoding: .utf8)!
print(jsonString)
6
katma
Herhangi bir parçanın sıfır olması durumunda çökecek, sonuçları çözmeyi zorlamak için çok kötü bir uygulama.//Zaten diğer cevaplarda zaten aynı bilgiler (çarpışma olmadan) var, lütfen yinelenen içerik göndermekten kaçının. Teşekkürler.
katma yazar Moritz, kaynak

Sorunuzun cevabı aşağıdadır:

Swift 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)
        }
4
katma

İşte bunu yapmak için kolay bir uzantı:

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
    }

}
0
katma
Bu cevap, JSON serileştirmesini bir uzantıya koymanın dışında, başka bir cevapta olmayan bir şey eklemiyor. Seçim göz önüne alındığında, JSONSerialization kütüphanesi üzerinden bir JSONEncoder kullanmayı tercih ediyorum. Gardiyanların kullanılması, “izin verirseniz” kullanmaktan daha karmaşıktır.
katma yazar Ryan H, kaynak