2016-07-08 9 views
-2

Alamofireを使用してポストリクエストで送信する変数をJSON値に渡そうとしています。最初の例はJSON値の見た目ですが、変数が渡されたときJSONは実際には2番目の例のように見えます。誰かが間違っているか、またはこれを修正する方法を知っていますか?JSONデータ操作

正しいJSON:

{ "gender": "male", 
    "dob": "08 Jul 2001", 
    "loyalty_points": "2", 
    "barber_type": "1",  
    "account": {   
     "first_name": "Bob",   
     "last_name": "Smith",  
     "email": "[email protected]",   
     "password": "1234",   
     "timestamp": "2016-07-08 20:26:13 +0000"  
    } 
} 

不正なJSON:

[ "loyalty_points": 0, 
    "account": { 
     email = "[email protected]"; 
     "first_name" = Bob; 
     "last_name" = Smith; 
     password = 1234; 
     timestamp = "2016-07-08 20:26:13 +0000"; 
    }, 
    "gender": Male, 
    "barber_type": 2, 
    "dob": 08 Jul 2001 
] 

スウィフトコード:

let account: [String: AnyObject] = [ "first_name": firstName!, "last_name": lastName!, "email": email!, "password": password!, "timestamp": NSDate()] 

let parameters: [String: AnyObject] = [ "gender": gender!, "dob": date!, "loyalty_points": "0", "barber_type": barberType!, "account": account] 

Alamofire.request(.POST, "api.exampledomain.co.uk/v1/user";, parameters: parameters as? [String : AnyObject], encoding: .JSON) 
+1

ので、どのような変換を行うことになっているコードは? – Alnitak

+1

2番目のダンプで何が間違っていると思われますか?どのように作成しましたか? –

+0

送信する前にパラメータ変数を出力して、正しいことを確認しています。 @Alnitak – User

答えて

-2

あなたはそれがどのように見えるそれぞれの人の情報のために同じフォーマットを、必要な場合あなたは、を使うことができるときにarraysで時間を無駄にしないでください。

スウィフトコード例:

let gender = "Male"   // Test data 
let date = "08 Jul 2001" 
let loyalty_points = 0 
let barberType = 1 
let firstName = "Bob" 
let lastName = "Smith" 
let email = "[email protected]" 
let password = "1234" 

let jsonstring = "{\t\"gender\": \"\(gender)\",\n\t\"dob\": \"\(date)\", \n\t\"loyalty_points\": \"\(loyalty_points)\",\n\t\"barber_type\": \"\(barberType)\",\t \n\t\"account\": {\t\t\n\t\t\"first_name\": \"\(firstName)\",\t\t\n\t\t\"last_name\": \"\(lastName)\",\t\n\t\t\"email\": \"\(email)\",\t\t\n\t\t\"password\": \"\(password)\",\t\t \n\t\t\"timestamp\": \"\(NSDate())\"\t\n\t}\n}" 

print(jsonstring) // Output the JSON code 

結果:

{ "gender": "Male", 
    "dob": "08 Jul 2001", 
    "loyalty_points": "0", 
    "barber_type": "1", 
    "account": {   
     "first_name": "Bob",   
     "last_name": "Smith",  
     "email": "[email protected]",   
     "password": "1234",  
     "timestamp": "2016-07-08 17:18:34 +0000"  
    } 
} 
+0

JSONを手作業でシリアライズすることは、壊れたJSONを生成するための確実な方法です。 – Alnitak

+0

あなたはより良い方法を提案しますか? @Alnitak – User

+1

@あなたはあなたが問題があると思う理由を説明していません。 'プリント()それは、あなたが取得する必要があると思うし、あなたが本当に*ているものの出力が実証されていない出力とそれを比較するだけでは不可能ですので'関数はAlamofire POSTから抜け出す*、出力JSONありませんコール。 – Alnitak

1

Alamofireが使用する基礎となるNSJSONSerialization.dataWithJSONObject()機能が法的JSONにNSDate()オブジェクトを変換することはできません、あなたがしようとすると、例外がスローされます。

したがって、最初にtimestampオブジェクトを文字列値に変換してから、accountオブジェクトに追加する必要があります。出力と

import Foundation 

let firstName: String? = "Bob" 
let lastName: String? = "Smith" 
let email: String? = "[email protected]" 
let password: String? = "1234" 

var formatter: NSDateFormatter = NSDateFormatter() 
formatter.dateFormat = "Y-MM-dd H:mm:ss +0000" 
let nsdateString: String = formatter.stringFromDate(NSDate()) 

let account: [String: AnyObject] = [ 
    "first_name": firstName!, 
    "last_name": lastName!, 
    "email": email!, 
    "password": password!, 
// "timestamp": NSDate() // <-- causes an exception if uncommented 
    "timestamp": nsdateString // already converted to string 
] 

let gender: String? = "Male" 
let date: String? = "08 Jul 2001" 
let barberType: String? = "1" 

let parameters: [String: AnyObject] = [ "gender": gender!, "dob": date!, "loyalty_points": "0", "barber_type": barberType!, "account": 

let data = try NSJSONSerialization.dataWithJSONObject(parameters, options: .PrettyPrinted) 
let str = String(data: data, encoding: NSUTF8StringEncoding) 

print(str!) 

{ 
    "loyalty_points" : "0", 
    "account" : { 
    "first_name" : "Bob", 
    "last_name" : "Smith", 
    "email" : "[email protected]", 
    "password" : "1234", 
    "timestamp" : "2016-07-08 22:02:50 +0000" 
    }, 
    "gender" : "Male", 
    "barber_type" : "1", 
    "dob" : "08 Jul 2001" 
}