web-dev-qa-db-ja.com

配列をswiftのJSON文字列に変換します

配列をSwiftで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)
}

また、savetoDictionart()メソッドを使用して、JSON文字列を返したいと思います。

55
DrPatience

現状では、データをデータに変換し、データをJSONとしてオブジェクトに変換しようとして(これは失敗し、JSONではありません)、それを文字列に変換しようとしていますが、基本的には無意味な変換がたくさんあります。

配列にJSONエンコード可能な値(文字列、数値、辞書、配列、nil)のみが含まれている限り、NSJSONSerializationを使用してそれを行うことができます。

代わりに、array-> data-> string部分を実行するだけです。

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

強制的なアンラップはおそらく使用すべきではありませんが、適切な出発点となります。

105
David Berry

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 Documentation

注:Swift 4には、新しいプロトコルを使用してオブジェクトをエンコードおよびデコードする機能があります。 Apples Documentation 、および 開始例のクイックチュートリアル です。

53
Jon Vogel

すでに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 UPDATE

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

転送に適したJSON文字列は、HTTPボディをJSONエンコードできるため、頻繁に表示されません。ただし、JSON stringifyの潜在的なユースケースの1つは、AlamoFireが現在サポートしているMultipart Postです。

20
Robert Chen

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文字列として使用できます。

5
pawan gupta

Swift 2.

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使用する場合は変数。

4
Mitul Marsoniya

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%動作テスト済み

1
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

1
mert

ヒント:JSON互換オブジェクトを含むNSArrayをJSONドキュメントを含むNSDataオブジェクトに変換するには、NSJSONSerializationの適切なメソッドを使用します。 JSONObjectWithDataはそうではありません。

ヒント2:データを文字列として使用することはほとんどありません。デバッグ目的のみ。

1
gnasher729

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
0
Tung Tran

これを試すことができます。

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
    }
0
kalpesh