2017-02-17 4 views
0

Es gibt 3 String-Variablenbestellt Wörterbuch in JSON

public var userLoginId : String? 
public var searchString : String? 
public var tableName : String? 

ein Wörterbuch haben:

let dict = ["userLoginId" : userLoginId, "searchString" : searchString,"tableName" : tableName] 

Jetzt serialisiert ich es von JSON:

let data = try! JSONSerialization.data(withJSONObject: dict, options :[]) 
let jsonstring = String(data:data, encoding:.utf8)! 

In jsonstring, jedes Mal, Ich bekomme einen ungeordneten JSON wie folgt:

"{\"tableName\":\"null\",\"userLoginId\":\"Dilip\",\"searchString\":\"Tata\"}" 

Wie kann ich in dasselbe Format gelangen, in dem ich dem Wörterbuch Wert zugewiesen habe?

+4

'Dictionary' hat keine Reihenfolge. –

+1

Ich weiß, dass das Wörterbuch keine Reihenfolge hat, aber zuerst denke ich brauche JSON in der gleichen Reihenfolge, in der ich Daten ins Wörterbuch lege.Zweitens ist, um JSON zu generieren, Wörterbuch die beste Lösung, aber ich bin neu in IOS, deshalb habe ich Probleme –

+0

@Nirav D, Bestellung ist nützlich, wenn JSON-Daten serialisiert und in ein Wörterbuch deserialisiert wird. Da das Wörterbuch keine Reihenfolge hat, könnten Sie am Ende viele verschiedene JSON-Strings schreiben, selbst wenn Sie vom selben Diktat kommen. Gibt es eine Möglichkeit, JSON zu deserialisieren, ohne ein Dict zu verwenden? – Efren

Antwort

0

Wörterbücher sind "ungeordnete Sammlungen". Sie haben überhaupt keine Reihenfolge für ihre Schlüssel/Wert-Paare. Zeitraum.

Wenn Sie eine geordnete Sammlung wünschen, verwenden Sie etwas anderes als ein Wörterbuch. (Ein Array von Einzelwörterbüchern ist eine Möglichkeit.) Sie können auch Code schreiben, der die Schlüssel eines Wörterbuchs in ein veränderbares Array lädt, das Array sortiert und anschließend das sortierte Schlüsselfeld zum Abrufen von Schlüssel/Wert-Paaren in der gewünschte Reihenfolge.

Sie können auch einen eigenen Sammlungstyp erstellen, der Zeichenfolgen als Indizes verwendet und die Elemente in sortierter Reihenfolge speichert. Swift macht das einfach, obwohl es rechenintensiv wäre.

+0

wie Sie sagten "Sie können auch Code schreiben, der die Schlüssel eines Wörterbuchs in ein veränderbares Array lädt, sortiert das Array und verwendet dann das sortierte Array von Schlüsseln zum Abrufen von Schlüssel/Wert Paare ", kaufen Zalak, hier Array von Schlüsseln werden in Bezug auf alphabetisch sortiert, aber meine Sorge ist, dass Wörterbuch Index nicht alphabetisch aufsteigend, absteigend –

2

Nicht nur Swifts Dictionary haben keine Bestellung, aber auch keine JSON-Wörterbücher, wie im Standard. Das Beste, was Sie wahrscheinlich tun könnten, ist, die Schlüssel in der richtigen Reihenfolge in einem Array zu speichern. Anstatt das Wörterbuch zu wiederholen, iterieren Sie stattdessen das geordnete Schlüsselfeld und holen es dann mit diesen Schlüsseln aus dem Wörterbuch. manuell

Um zu vermeiden, die Schlüssel zu wiederholen, können Sie Ihr Wörterbuch als ein Array von (Key, Value) Tupeln ausdrücken, etwa so:

let keyValuePairs = [ 
    ("userLoginId", userLoginId), 
    ("searchString", searchString), 
    ("tableName", tableName) 
] 

Dann können Sie diese raffinierte Dictionary Erweiterung verwenden, eine neue Dictionary von jenen (Key, Value) zu erstellen Tupel:

extension Dictionary { 
    init(_ keyValuePairs: [(Key, Value)]) { 
     self.init(minimumCapacity: keyValuePairs.count) 

     for (key, value) in keyValuePairs { 
      self[key] = value 
     } 
    } 
} 

let dict = Dictionary(keyValuePairs) 
let orderedKeys = keyValuePairs.map{ $0.0 } 

Jetzt können Sie die orderedKeys in Ihrem Swift Code verwenden oder speichern sie in JSON neben dem dict:

print("Example usage:") 
for key in orderedKeys { 
    let value = dict[key]! 

    print("\(key): \(value)") 
} 
0

Ich weiß, das wurde vor einem Jahr gefragt. Aber ich bin kürzlich auf dieses Problem gestoßen, als ich Komponententests geschrieben habe. Im Grunde habe ich ein falsches JSON-Wörterbuch geschrieben, JSONSerialization verwendet, um dieses in Daten umzuwandeln, und es an ein Parsing-Objekt übergeben. In diesem speziellen Test musste jedoch die Reihenfolge beibehalten werden oder der Test würde fehlschlagen, und das zuvor beschriebene Verfahren tat dies nicht. Also, was für mich funktionierte, ist, anstatt mit einem Wörterbuch zu beginnen, ich beginne mit einem Test-JSON-String und kodiere das in Daten mit utf8. Bei der Analyse in ein Wörterbuch wird die Reihenfolge der JSON-Zeichenfolge im geparsten Wörterbuch beibehalten.