programing

어레이를 JSON 문자열로 빠르게 변환

newsource 2023. 3. 16. 21:31

어레이를 JSON 문자열로 빠르게 변환

어레이를 어떻게 스위프트에서 JSON 문자열로 변환합니까?기본적으로 버튼이 내장된 텍스트 필드가 있습니다.버튼을 누르면 텍스트 필드 텍스트가 에 추가됩니다.testArray또한 이 배열을 JSON 문자열로 변환하고 싶습니다.

제가 시도한 것은 다음과 같습니다.

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 인코딩 가능한 값(string, number, dictionary, array, n0)만 포함되어 있으면 NSJON Serialization을 사용하여 수행할 수 있습니다.

대신 어레이->데이터->문자열 부분만 수행합니다.

스위프트 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과 시작 예제를 위한 간단한 튜토리얼입니다.

이미 SwiftyJ를 사용하고 있는 경우손:

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 stringify의 잠재적인 사용 사례는 Alamo Fire가 현재 지원하고 있는 Multipart Post입니다.

swift 2.3에서 어레이를 json String으로 변환하는 방법

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

이제 Sting을 JSON 문자열로 사용할 수 있습니다.

스위프트 5

총칭 " " "extensionarray JSON에 오브젝트 string이치하다

  • 앱의 문서 디렉토리(iOS/MacOS)에 저장
  • 데스크톱(MacOS)의 파일로 직접 출력

.

extension JSONEncoder {
    static func encode<T: Encodable>(from data: T) {
        do {
            let jsonEncoder = JSONEncoder()
            jsonEncoder.outputFormatting = .prettyPrinted
            let json = try jsonEncoder.encode(data)
            let jsonString = String(data: json, encoding: .utf8)
            
            // iOS/Mac: Save to the App's documents directory
            saveToDocumentDirectory(jsonString)
            
            // Mac: Output to file on the user's Desktop
            saveToDesktop(jsonString)
            
        } catch {
            print(error.localizedDescription)
        }
    }
    
    static private func saveToDocumentDirectory(_ jsonString: String?) {
        guard let path = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first else { return }
        let fileURL = path.appendingPathComponent("Output.json")
        
        do {
            try jsonString?.write(to: fileURL, atomically: true, encoding: .utf8)
        } catch {
            print(error.localizedDescription)
        }
        
    }
    
    static private func saveToDesktop(_ jsonString: String?) {
        let homeURL = FileManager.default.homeDirectoryForCurrentUser
        let desktopURL = homeURL.appendingPathComponent("Desktop")
        let fileURL = desktopURL.appendingPathComponent("Output.json")
        
        do {
            try jsonString?.write(to: fileURL, atomically: true, encoding: .utf8)
        } catch {
            print(error.localizedDescription)
        }
    }
}

예:

struct Person: Codable {
    var name: String
    var pets: [Pet]
}

struct Pet: Codable {
    var type: String
}

extension Person {
    static func sampleData() -> [Person] {
        [
            Person(name: "Adam", pets: []),
            Person(name: "Jane", pets: [
                    Pet(type: "Cat")
            ]),
            Person(name: "Robert", pets: [
                    Pet(type: "Cat"),
                    Pet(type: "Rabbit")
            ])
        ]
    }
}

사용방법:

JSONEncoder.encode(from: Person.sampleData())

출력:

다음과 됩니다.Output.json파일:

[
  {
    "name" : "Adam",
    "pets" : [

    ]
  },
  {
    "name" : "Jane",
    "pets" : [
      {
        "type" : "Cat"
      }
    ]
  },
  {
    "name" : "Robert",
    "pets" : [
      {
        "type" : "Cat"
      },
      {
        "type" : "Rabbit"
      }
    ]
  }
]

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 변수를 사용합니다.

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

힌트: JSON 호환 개체를 포함하는 NSAray를 JSON 문서를 포함하는 NSData 개체로 변환하려면 적절한 NSJON Serialization 방법을 사용하십시오.JSONObjectWithData가 아닙니다.

힌트 2: 데이터를 문자열로 사용하는 경우는 거의 없습니다.디버깅용으로만 사용합니다.

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

스위프트 5

오브젝트가 확인되었는지 확인합니다.Codable.

Int, String, Double 및 ...와 같은 Swift의 기본 변수 유형은 모두 다음과 같습니다.Codable즉, 테마를 데이터로 변환하거나 반대로 변환할 수 있습니다.

예를 들어 Int의 배열을 String Base64로 변환합니다.

let array = [1, 2, 3]
let data = try? JSONEncoder().encode(array)
nsManagedObject.array = data?.base64EncodedString()

다음 사항을 확인합니다.NSManaged변수 유형은String코어 데이터 오브젝트에 커스텀클래스를 사용하는 경우 코어 데이터 스키마 에디터 및 커스텀클래스로 이동합니다.

base64 문자열을 어레이로 변환합니다.

var getArray: [Int] {
    guard let array = array else { return [] }
    guard let data = Data(base64Encoded: array) else { return [] }
    guard let val = try? JSONDecoder().decode([Int].self, from: data) else { return [] }
    return val
}

자신의 오브젝트를 로 변환하지 않는다.Base64CoreData에 String으로 저장하거나 String으로 저장할 수 있습니다.RelationCoreData(데이터베이스)에 있습니다.

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% 동작 테스트 완료

이거 드셔보세요.

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
    }

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