Swift에서 사전을 JSON으로 변환


답변:


240

스위프트 3.0

Swift 3에서는 Swift API 디자인 지침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]. 그러나 중괄호는 어떻습니까?
Orkhan Alizade

1
귀하의 질문을 이해하지 못합니다. 어떤 중괄호? JSON으로 사전을 인코딩하는 것에 대해 물었고 이것이 저의 대답입니다.
Eric Aya

1
JSON 중괄호{"result":[{"body":"Question 3"}] }
Orkhan Alizade

2
위의 호출 @OrkhanAlizade dataWithJSONObject 것이다 결과의 일부로서 "중괄호"(즉, 중괄호)을 생성 NSData개체를.
Rob

감사. 참고-약어를 나타내는 대신 d0을 사용하는 것이 좋습니다.
johndpope

166

당신은 잘못된 가정을하고 있습니다. 디버거 / 놀이터에서 사전을 대괄호 (Cocoa가 사전을 표시하는 방법)로 표시하기 때문에 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]

또는 Swift 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 출력에서 ​​중괄호로 묶습니다.

편집하다:

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

일반 Swift 문자열은 JSON 텍스트 선언에서도 잘 작동합니다.
Fred Faust

@thefredelement, NSData를 Swift 문자열로 직접 변환하는 방법은 무엇입니까? 데이터를 문자열로 변환하는 것은 NSString의 함수입니다.
Duncan C

이 방법을 구현하고 Swift 문자열에서 데이터 / 인코딩 초기화를 사용했지만 Swift 1.x에서 사용할 수 있는지 확실하지 않습니다.
Fred Faust

내 하루를 구했다. 감사.
Shobhit 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)
    }
}

이것은 문제를 해결하는 데 좋고 재사용 가능한 방법이지만 약간의 설명은 새로운 이민자가 더 잘 이해하는 데 도움이 될 것입니다.
nilobarp 2014 년

사전의 키에 사용자 정의 객체 배열이 포함되어있는 경우에 적용될 수 있습니까?
Raju 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)

어떤 부분이 없거나, 결과를 풀기 위해 매우 나쁜 연습은 충돌합니다. // 어쨌든 다른 답변에 이미 동일한 정보 (충돌없이)가 있으므로 중복 된 내용을 게시하지 마십시오. 감사.
Eric Aya

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
여기에 몇 가지 실수가 있습니다. 왜 Swift 's Dictionary 대신 Foundation의 NSDictionary를 사용합니까?! 또한 실제 JSON 데이터를 반환하는 대신 String을 값으로 사용하여 새 사전을 반환하는 이유는 무엇입니까? 이것은 말이되지 않습니다. 또한 옵션으로 반환 된 암시 적으로 래핑되지 않은 옵션은 실제로 좋은 생각이 아닙니다.
Eric Aya
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.