ProgramingTip

신속하게 배열을 JSON 문자열로 변환

bestdevel 2020. 12. 31. 23:34
반응형

신속하게 배열을 JSON 문자열로 변환


스위프트에서 배열을 JSON 문자열 로 어떻게 CHAPTER 2 합니까? 기본적으로 버튼이 포함 된 텍스트 필드가 있습니다. 버튼을 표시 할 텍스트 필드 텍스트가 추가 testArray됩니다. 또한이 배열을 JSON 문자열 로 CHAPTER 2하고 싶습니다 .

이것이 내가 시도한 것입니다.

func addButtonPressed() {
    if goalsTextField.text == "" {
        // Do nothing
    } else {
        testArray.append(goalsTextField.text)
        goalsTableView.reloadData()
        saveDatatoDictionary()
    }
}

func saveDatatoDictionary() {
    data = NSKeyedArchiver.archivedDataWithRootObject(testArray)
    newData = NSJSONSerialization.JSONObjectWithData(data!, options: NSJSONReadingOptions(), error: nil) as? NSData
    string = NSString(data: newData!, encoding: NSUTF8StringEncoding) 
    println(string)
}

또한 방법을 사용하여 JSON 문자열 을 반환하고 싶습니다 savetoDictionart().


그대로 데이터로 변환 한 다음 데이터를 JSON (실패, JSON이 아님)으로 개체로 변환하고이를 확장 변환하려고 시도하면 기본적으로 변환이 많이 발생합니다.

배열에 JSON 인코딩 가능한 값 (문자열, 숫자, 사전, 배열, nil) 만 포함되어있는 한 NSJSONSerialization을 사용하여 수행 할 수 있습니다.

대신 array-> data-> string 부분을 수행하십시오.

스위프트 3/4

let array = [ "one", "two" ]

func json(from object:Any) -> String? {
    guard let data = try? JSONSerialization.data(withJSONObject: object, options: []) else {
        return nil
    }
    return String(data: data, encoding: String.Encoding.utf8)
}

print("\(json(from:array as Any))")

원래 답변

let array = [ "one", "two" ]
let data = NSJSONSerialization.dataWithJSONObject(array, options: nil, error: nil)
let string = NSString(data: data!, encoding: NSUTF8StringEncoding)

강제 언 래핑을 사용하는 것이 좋습니다. 올바른 시작점을 제공합니다.


Swift 3.0-4.0 버전

do {

    //Convert to Data
    let jsonData = try JSONSerialization.data(withJSONObject: dictionaryOrArray, options: JSONSerialization.WritingOptions.prettyPrinted)

    //Convert back to string. Usually only do this for debugging
    if let JSONString = String(data: jsonData, encoding: String.Encoding.utf8) {
       print(JSONString)
    }

    //In production, you usually want to try and cast as the root data structure. Here we are casting as a dictionary. If the root object is an array cast as [Any].
    var json = try JSONSerialization.jsonObject(with: jsonData, options: JSONSerialization.ReadingOptions.mutableContainers) as? [String: Any]


} catch {
    print(error.description)
}

JSONSerialization.WritingOptions.prettyPrinted옵션은 최종 소비자가 디버거에서 인쇄하는 경우 읽기 쉬운 형식으로 최종 소비자에게 제공합니다.

참조 : Apple 문서

JSONSerialization.ReadingOptions.mutableContainers옵션을 사용하면 반환 된 배열 및 / 또는 사전을 사용합니다.

모든 ReadingOptions에 대한 참조 : Apple 문서

참고 : Swift 4에는 새로운 프로토콜을 사용하여 사용하는 기능을 사용하고 있습니다. 다음은 Apples Documentation시작 예제에 대한 빠른 안내입니다 .


이미 SwiftyJSON을 사용중인 경우 :

https://github.com/SwiftyJSON/SwiftyJSON

다음과 같이 할 수 있습니다.

// this works with dictionaries too
let paramsDictionary = [
    "title": "foo",
    "description": "bar"
]
let paramsArray = [ "one", "two" ]
let paramsJSON = JSON(paramsArray)
let paramsString = paramsJSON.rawString(encoding: NSUTF8StringEncoding, options: nil)

SWIFT 3 업데이트

 let paramsJSON = JSON(paramsArray)
 let paramsString = paramsJSON.rawString(String.Encoding.utf8, options: JSONSerialization.WritingOptions.prettyPrinted)!

전송에 좋은 JSON은 HTTP 본문을 JSON으로 인코딩 할 수 있기 때문에 자주 나오지 언어입니다. 그러나 JSON stringify의 강력한 사용 사례 중 하나는 AlamoFire가 현재 지원하는 Multipart Post입니다.


Swift 2.3에서 배열을 json으로 변환하는 방법

var yourString : String = ""
do
{
    if let postData : NSData = try NSJSONSerialization.dataWithJSONObject(yourArray, options: NSJSONWritingOptions.PrettyPrinted)
    {
        yourString = NSString(data: postData, encoding: NSUTF8StringEncoding)! as String
    }
}
catch
{
    print(error)
}

이제 yourSting을 JSON으로 사용할 수 있습니다.


SWIFT 2.0

var tempJson : NSString = ""
do {
    let arrJson = try NSJSONSerialization.dataWithJSONObject(arrInvitationList, options: NSJSONWritingOptions.PrettyPrinted)
    let string = NSString(data: arrJson, encoding: NSUTF8StringEncoding)
    tempJson = string! as NSString
}catch let error as NSError{
    print(error.description)
}

참고 :- 사용하십시오 tempJson 변수를 사용하십시오.


힌트 : JSON 호환 개체가 포함 된 NSArray를 JSON 문서가 포함 된 NSData 개체로 변환하여 적절한 NSJSONSerialization 메서드를 사용하십시오. JSONObjectWithData가 아닙니다.

힌트 2 : 해당 데이터를 사용하는 경우는 거의 없습니다. 목적 목적으로 만.


Swift 3.0의 경우 다음을 참합니다.

var postString = ""
    do {
        let data =  try JSONSerialization.data(withJSONObject: self.arrayNParcel, options: .prettyPrinted)
        let string1:String = NSString(data: data, encoding: String.Encoding.utf8.rawValue) as! String

        postString = "arrayData=\(string1)&user_id=\(userId)&markupSrcReport=\(markup)"
    } catch {
        print(error.localizedDescription)
    }
    request.httpBody = postString.data(using: .utf8)

100 % 작동 테스트


extension Array where Element: Encodable {
    func asArrayDictionary() throws -> [[String: Any]] {
        var data: [[String: Any]] = []

        for element in self {
            data.append(try element.asDictionary())
        }
        return data
    }
}

extension Encodable {
        func asDictionary() throws -> [String: Any] {
            let data = try JSONEncoder().encode(self)
            guard let dictionary = try JSONSerialization.jsonObject(with: data, options: .allowFragments) as? [String: Any] else {
                throw NSError()
            }
            return dictionary
        }
}

모델에서 Codable 프로토콜을 사용하는 경우 이러한 확장은 사전 표현을 얻는 데 도움이 될 수 있습니다 ( Swift 4 )


이것을 시도 할 수 있습니다.

func convertToJSONString(value: AnyObject) -> String? {
        if JSONSerialization.isValidJSONObject(value) {
            do{
                let data = try JSONSerialization.data(withJSONObject: value, options: [])
                if let string = NSString(data: data, encoding: String.Encoding.utf8.rawValue) {
                    return string as String
                }
            }catch{
            }
        }
        return nil
    }

Swift 4.2의 경우 해당 코드는 여전히 잘 작동합니다.

 var mnemonic: [String] =  ["abandon",   "amount",   "liar", "buyer"]
    var myJsonString = ""
    do {
        let data =  try JSONSerialization.data(withJSONObject:mnemonic, options: .prettyPrinted)
       myJsonString = NSString(data: data, encoding: String.Encoding.utf8.rawValue) as! String
    } catch {
        print(error.localizedDescription)
    }
    return myJsonString

참조 URL : https://stackoverflow.com/questions/28325268/convert-array-to-json-string-in-swift

반응형