swift - Diccionario en orden incorrecto-JSON
foundation (2)
Estoy tratando de crear un diccionario que pueda convertir en un objeto con formato JSON y enviar al servidor.
Ejemplo:
var users = [
[
"First": "Albert",
"Last": "Einstein",
"Address":[
"Street": "112 Mercer Street",
"City": "Princeton"]
],
[
"First": "Marie",
"Last": "Curie",
"Address":[
"Street": "108 boulevard Kellermann",
"City": "Paris"]]
]
Yo uso esta funcion
func nsobjectToJSON(swiftObject: NSObject) -> NSString {
var jsonCreationError: NSError?
let jsonData: NSData = NSJSONSerialization.dataWithJSONObject(swiftObject, options: NSJSONWritingOptions.PrettyPrinted, error: &jsonCreationError)!
var strJSON = NSString()
if jsonCreationError != nil {
println("Errors: /(jsonCreationError)")
}
else {
// everything is fine and we have our json stored as an NSData object. We can convert into NSString
strJSON = NSString(data: jsonData, encoding: NSUTF8StringEncoding)!
println("/(strJSON)")
}
return strJSON
}
Pero mi resultado es este:
[
{
"First" : "Albert",
"Address" : {
"Street" : "112 Mercer Street",
"City" : "Princeton"
},
"Last" : "Einstein"
},
{
"First" : "Marie",
"Address" : {
"Street" : "108 boulevard Kellermann",
"City" : "Paris"
},
"Last" : "Curie"
}
]
Problema : ¿por qué es el apellido? Creo que debería estar por encima de la dirección. Avíseme qué estoy haciendo mal con NSDictionary para que esto salga mal. Cualquier ayuda sería muy apreciada, gracias.
Me gustó esto.
let stagesDict = NSDictionary()
if let strVal = sleepItemDict["stages"] as? NSDictionary {
stagesDict = strVal
let sortedKeys = (stagesDict.allKeys as! [String]).sorted(by: <)
var sortedValues : [Int] = []
for key in sortedKeys {
let value = stagesDict[key]!
print("/(key): /(value)")
sortedValues.append(value as! Int)
}
}
Para publicar lo que ya se ha dicho en los comentarios: Los diccionarios son "colecciones desordenadas". No tienen ningún orden en absoluto para sus pares clave / valor. Período.
Si desea una colección ordenada, use algo que no sea un diccionario. (una matriz de diccionarios de un solo elemento es una forma de hacerlo). También puede escribir código que cargue las claves de un diccionario en una matriz mutable, clasifique la matriz y luego use la matriz ordenada de claves para obtener pares clave / valor en el orden deseada
También puede crear su propio tipo de colección que use cadenas como índices y mantenga los elementos ordenados. Swift lo hace sencillo, aunque sería computacionalmente costoso.