【问题标题】:JSON Data ManipulationJSON数据操作
【发布时间】:2016-07-08 20:32:54
【问题描述】:

我正在尝试将变量传递到 JSON 值中,以便使用 Alamofire 在发布请求中发送。第一个示例是 JSON 值的外观,但是当传递变量时,JSON 实际上看起来像第二个示例。有谁知道出了什么问题,或者如何解决这个问题?

正确的 JSON:

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

不正确的 JSON:

[  "loyalty_points": 0, 
   "account": {
       email = "bob@live.com";
       "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
]

Swift 代码:

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) 

【问题讨论】:

  • 那么应该进行转换的代码呢?
  • 您认为第二次转储中有什么不正确的地方以及您是如何创建的?
  • 我正在打印参数变量以在发送前检查它是否正确。 @Alnitak
  • @AminNegm-Awad 这显然是不合法的 JSON
  • @AminNegm-Awad 他已经回答了这个问题 - 他只是使用不会产生 JSON 的print()。然而,Animofire .request() 函数完全能够在发送 Dictionary 时将其转换为合法的 JSON,但 OP 完全没有说明为什么他们认为他们的代码没有按要求运行。

标签: json swift post networking alamofire


【解决方案1】:

Alamofire 使用的底层NSJSONSerialization.dataWithJSONObject() 函数无法将NSDate() 对象转换为合法的JSON,当你尝试时会抛出异常。

因此,您需要先将该timestamp 对象转换为字符串值,然后将其添加到account 对象中。

import Foundation

let firstName: String? = "Bob"
let lastName: String? = "Smith"
let email: String? = "bob@live.com"
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" : "bob@live.com",
    "password" : "1234",
    "timestamp" : "2016-07-08 22:02:50 +0000"
  },
  "gender" : "Male",
  "barber_type" : "1",
  "dob" : "08 Jul 2001"
}

【讨论】:

    【解决方案2】:

    如果您希望每个人的信息采用相同的格式,看起来就像您所做的那样,那么当您可以使用 string 时,不要在 arrays 上浪费时间。

    Swift 示例代码:

    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 = "bob@live.com"
    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": "bob@live.com",        
            "password": "1234",      
            "timestamp": "2016-07-08 17:18:34 +0000"    
        } 
    }
    

    【讨论】:

    • 手动序列化 JSON 是产生损坏 JSON 的可靠方法。
    • 您有什么更好的方法吗? @Alnitak
    • @User 你没有解释为什么你认为你有问题。 print() 函数不输出 JSON,因此根本不可能将其与您认为应该获得的输出进行比较,而且您还没有证明您真正得到了什么输出Alamofire POST 调用。
    • 我不知道我为什么会遇到问题。我要做的就是使用 POST 请求发送一个 JSON 值,JSON 看起来像我发布的第一个示例。
    • 所以请告诉我们您实际遇到了什么问题!错误消息、调试输出等等!
    猜你喜欢
    • 2021-03-04
    • 1970-01-01
    • 2012-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多