2017-10-08 1 views
-2

Wenn ich ein Array in meinem JSON-Objekt und konvertieren Sie es in JSON, nach dem Drucken gibt es Klammern anstelle von geschweiften Klammer.Swift Verwenden Array in JSON

var jsonObject : [String: Any] = [:] 

var x = [1,2,3,4] 
jsonObject["arr"] = x 
do{ 
    let jsonData = try JSONSerialization.data(withJSONObject: jsonObject, options: []) 

    let decoded = try JSONSerialization.jsonObject(with: jsonData, options: []) 
    print(decoded) 
} ... 

Und das Ergebnis des Druckens:

{ 
arr = (
     1, 
     2, 
     3, 
     4 
    ); 
} 

Aber in JSON, um ein Array zu zeigen, verwendet es [statt (

Was ist los

Antwort

1

Sie konvertieren das Wörterbuch zu JSON und dann Sie es zurück konvertieren und drucken (!).

die JSON-Zeichenfolge drucken Sie

let jsonData = try JSONSerialization.data(withJSONObject: jsonObject) 
let jsonString = String(data: jsonData, encoding: .utf8) 
print(jsonString ?? "Wrong data") 
+0

Danke. Nachdem dies gemacht und gedruckt wurde, ist das Ergebnis "{\ arr \": [1,2,3,4]} ". Ist es o.k? Einige hinzugefügte Backslashes sind OK? – rick

+1

Das ist OK. Die Backslashes sind virtuell, sie werden benötigt, um doppelte Anführungszeichen in einer literalen Zeichenfolge anzuzeigen. – vadian

0

Sie sollten diese nutzen.? um Ihren JSON zu drucken

public extension Collection { 

    /// Convert self to JSON String. 
    /// - Returns: Returns the JSON as String or empty string if error while parsing. 
    func json() -> String { 
     do { 
      let jsonData = try JSONSerialization.data(withJSONObject: self, options: [.prettyPrinted]) 
      guard let jsonString = String(data: jsonData, encoding: String.Encoding.utf8) else { 
       print("Error creating string with data.") 
       return "{}" 
      } 
      return jsonString 
     } catch let parseError { 
      print("json serialization error: \(parseError)") 
      return "{}" 
     } 
    } 
} 

Die Konvertierung ist korrekt, es ist nur, dass Sie die decodierte Version drucken, die ein schnelles Wörterbuch ist, nicht JSON.

var jsonObject : [String: Any] = [:] 

var x = [1,2,3,4] 
jsonObject["arr"] = x 
print(jsonObject.json()) 
do{ 
    let jsonData = try JSONSerialization.data(withJSONObject: jsonObject, options: []) 

    let decoded = try JSONSerialization.jsonObject(with: jsonData, options: []) 
    print(decoded) 
} 

Ausgang: -

{ 
    "arr" : [ 
    1, 
    2, 
    3, 
    4 
    ] 
} 
0

Ich habe einige Druck Klauseln Sie Code zu schreiben, und das Konsolenprotokoll als Kommentar eingefügt.

var jsonObject : [String: Any] = [:] 

var x = [1,2,3,4] 
jsonObject["arr"] = x 
print(type(of: jsonObject)) // Dictionary<String, Any> 
do{ 
    let jsonData = try JSONSerialization.data(withJSONObject: jsonObject, options: .prettyPrinted) 

    let decoded = try JSONSerialization.jsonObject(with: jsonData, options: .allowFragments) 
    print(type(of: decoded)) // __NSSingleEntryDictionaryI 

    let str = String(data: jsonData, encoding: .utf8) 
    print(str!) /* { 
    "arr" : [ 
     1, 
     2, 
     3, 
     4 
     ] 
    }*/ 
} 

Wie Sie sehen können, die Art der decoded__NSSingleEntryDictionaryI ist, so das Ergebnis des Druckens nicht wie das, was erwartet Sie, mit „(“ anstelle von „[“. Wenn Sie die richtige Darstellung in JSON möchten, Sie sollten die jsonData-String konvertieren.

1

Wenn Sie ein Swift Objekt drucken, Swift Debugger es jedoch frei, ist es drucken möchte. es ist nur für die Bequemlichkeit, gibt es keine Garantien über das Format. So druckt er Arrays in Klammern .

Wenn Sie es in JSON konvertieren, auf der anderen Seite, es erstellt einen JSON-String und JSON hat ein spezifiziertes Format für Arrays, das eckige Klammern enthält.

UPDATE: nach dem Lesen der Frage, es scheint mir, Sie haben den Eindruck, dass Sie eine JSON-Darstellung Ihres Objekts drucken. Du bist nicht. Was Sie zur Zeit tun, ist, dass Sie Ihr Swift-Objekt in JSON konvertieren und es dann wieder in ein Swift-Objekt konvertieren. Und dann druckst du das resultierende Swift-Objekt aus (siehe Abschnitt 1 meiner Antwort).

Wenn Sie also die JSON-Darstellung drucken möchten, müssen Sie jsonData in String (siehe andere Antworten) konvertieren und diese Zeichenfolge drucken. Sie sollten NSJSONSerialization nicht erneut für die Rückwärtskonvertierung verwenden.