2017-12-20 3 views
0

Mein Zweck ist die Ausführung einer REST-Postanforderung über Alamofire.Vom Swift-Objekt zu json (formatiert [String: Beliebig]) für Alamofire-REST-Post-Parameter (definiert als [String: Beliebige])

Ich habe ein Objekt:

struct Dog: Codable { 
    var name: String 
    var owner: String 
} 

ich verwenden:

let JSONString = user.toJSONString(prettyPrint: true) //ObjectMapper call 

Rückkehr:

{ 
    "name" : "Jon", 
    "owner" : "Jon Doe" 
} 

Aber ich will eine [String: Any] Struktur, geeignet für alamofire Anfrage wie:

[ 
    "name" : "Jon", 
    "owner" : "Jon Doe" 
] 

Wie geht das?

+0

Sie könnten 'let dict = JSONSerialization.jsonObject (mit: JSONString.data (using: .utf8), Optionen: [])' (müssen versuchen/fangen), aber ich denke, dass es einfacher ist Lösung. – Larme

Antwort

0

Ihre Dog ist nicht richtig konfiguriert ObjectMapper zu verwenden, fehlt Mappable Protokoll.

struct Dog: Mappable { 
    var name: String? 
    var owner: String? 

    init?(map: Map) { 

    } 

    // Mappable 
    mutating func mapping(map: Map) { 
     name <- map["name"] 
     owner <- map["owner"] 
    } 
} 

Dann können Sie verwenden, um BaseMappable.toJSON Alamofire der Parameter zu übergeben, die [String: Any] ist

let parameters: Parameters = user.toJSON() 
_ = Alamofire.request(theURL, method:.post, parameters: parameters, encoding: JSONEncoding.default).validate().responseJSON() { 
    // -----... 
} 

PS: Ihre user darf nicht ein Dog ich denke? : P

+0

Es ist konfiguriert, aber ich habe diese Mapping-Sachen nicht zur Vereinfachung eingefügt. Wow, die Lösung scheint sehr einfach zu sein. Das habe ich mit ObjectMapper erwartet. Ich werde es ausprobieren und Sie wissen lassen. –

+0

Hoffentlich hat es funktioniert :) – zcui93

0

Eine Lösung ist eine Eigenschaft auf Ihre Struktur hinzufügen, um eine Wörterbuch Darstellung zurückzukehren, entweder komplizierter

var dictionaryRepresentation : [String : String] { 
    return try! JSONSerialization.jsonObject(with: try! JSONEncoder().encode(self)) as! [String : String] 
} 

oder ganz einfach

var dictionaryRepresentation : [String : String] { 
    return ["name" : name, "owner" : owner] 
} 

Hinweis:

Im Grunde nie senden Sie prettyPrinted Strings zu einem se rver. Es kümmert sich nicht um Schönheit.

+0

wie man diese Eigenschaft verwendet? dictionaryRepresentation = user.toJSONString (prettyPrint: true) ?? –

+0

Setze es in die Struktur und benutze es 'let dog = Dog (Name:" Pluto ", Besitzer:" Goofy ")" let dict = dog.dictionaryRepresentation ". Vergessen Sie 'toJSONString' – vadian