Wie konvertiert man ein Array schnell in einen JSON - String? Grundsätzlich habe ich ein Textfeld mit einer darin eingebetteten Schaltfläche . Wenn die Schaltfläche gedrückt wird, wird der Textfeld-Text der testArray
hinzugefügt. . Außerdem möchte ich dieses Array in einen JSON - String konvertieren.
Das habe ich versucht:
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)
}
Ich möchte auch die Zeichenfolge JSON mit meiner savetoDictionart()
-Methode zurückgeben.
So wie es aussieht, konvertiert man es in Daten, versucht dann, die Daten als JSON in ein Objekt zu konvertieren (was fehlschlägt, es ist kein JSON) und konvertiert das in einen String. Im Grunde gibt es eine Menge bedeutungsloser Transformationen.
Solange das Array nur JSON-codierbare Werte enthält (Zeichenfolge, Anzahl, Wörterbuch, Array, Null), können Sie dazu einfach NSJSONSerialization verwenden.
Stattdessen machen Sie einfach die Array-> Data-> String-Teile:
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))")
Ursprüngliche Antwort
let array = [ "one", "two" ]
let data = NSJSONSerialization.dataWithJSONObject(array, options: nil, error: nil)
let string = NSString(data: data!, encoding: NSUTF8StringEncoding)
zwar sollten Sie kein erzwungenes Abwickeln verwenden, aber Sie haben den richtigen Ausgangspunkt.
Swift 3.0 - 4.0 Version
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)
}
Die JSONSerialization.WritingOptions.prettyPrinted
-Option gibt dem Endverbraucher ein lesbareres Format, wenn er im Debugger ausgedruckt werden soll.
Referenz: Apple-Dokumentation
Mit der Option JSONSerialization.ReadingOptions.mutableContainers
können Sie die zurückgegebenen Arrays und/oder Wörterbücher mutieren.
Referenz für alle ReadingOptions: Apple-Dokumentation
HINWEIS: Swift 4 kann Ihre Objekte mit einem neuen Protokoll codieren und decodieren. Hier ist Apples Documentation und ein Quick Tutorial für ein Startbeispiel .
Wenn Sie bereits SwiftyJSON verwenden:
https://github.com/SwiftyJSON/SwiftyJSON
Du kannst das:
// 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-Zeichenfolgen, die sich gut für den Transport eignen, werden nicht oft angezeigt, da Sie einen HTTP-Body mit JSON kodieren können. Ein möglicher Anwendungsfall für JSON stringify ist Multipart Post, den AlamoFire unterstützt.
So konvertieren Sie ein Array in Swift 2.3 in einen 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)
}
Und jetzt können Sie IhrenSting als JSON-String verwenden.
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)
}
HINWEIS: - use tempJson variable, wenn Sie verwenden möchten.
Für Swift 3.0 musst du folgendes verwenden:
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% arbeitsgeprüft
Hinweis: Um ein NSArray mit JSON-kompatiblen Objekten in ein NSData-Objekt zu konvertieren, das ein JSON-Dokument enthält, verwenden Sie die entsprechende Methode der NSJSONSerialization. JSONObjectWithData ist es nicht.
Hinweis 2: Sie möchten diese Daten selten als Zeichenfolge. Nur für Debugging-Zwecke.
Für Swift 4.2 funktioniert dieser Code immer noch einwandfrei
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
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
}
}
Wenn Sie in Ihren Modellen codierbare Protokolle verwenden, können diese Erweiterungen hilfreich sein, um die Darstellung des Wörterbuchs zu erhalten (Swift 4)
Sie können es versuchen.
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
}