轻松将对象序列化为 JSON

Posted

技术标签:

【中文标题】轻松将对象序列化为 JSON【英文标题】:Easily serialize an object to JSON 【发布时间】:2015-01-19 13:31:12 【问题描述】:

如何将 Swift 对象序列化为 JSON,例如以下对象:

class Order 

   var id:Int
   var title:String
   var email:String

   init(id:Int, title:String, email:String) 
      self.id = id
      self.title = title
      self.email = email
   


let order = Order(id:345, title:"Title", email:"email@gmail.com")

目前我尝试像这样创建一个 SwiftyJSON JSON 对象,但它仍然需要我手动指定每个属性:

let json = JSON()
json["id"] = order.id
json["title"] = order.title
json["email"] = order.email

此外,这对我没有帮助,因为 Alamofire 不理解 SwiftyJSON 的对象,需要我手动创建字典:

let dict:[String, AnyObject] = [
    "id":order.id,
    "title":order.title,
    "email":order.email
]

Alamofire.request(.POST, Configuration.ADD_ORDER_URL, parameters: dict, encoding:.JSON)

回顾一下,如何将对象序列化为 JSON 并使用 Alamofire 立即发送?

【问题讨论】:

看看this code,它可以帮助您将对象序列化为JSON。 我已将您的问题编辑得更清楚一些,如果您不同意,请随时回滚编辑。 【参考方案1】:

我遇到了同样的问题,但是我花了很长时间才发现这个问题。

但是,user2629998 的响应是正确的。在 OP 的情况下,他使用的是字典,所以他需要这样声明:

let parameters:[String : AnyObject] = []

另外,你必须声明标题

let headers = ["Content-Type": "application/json"]

稍后必须传递给 alamofire 请求

Alamofire.request(.POST, yourEndpoint, headers:headers, parameters: parameters, encoding: .JSON)

我决定详细说明 user2629998,因为标题可以产生影响。

另外,我想指出,这对于许多用户来说可能是不直观的,正如我在搜索有关此问题或类似问题的不同问题时注意到的那样。为什么?因为即使你想发送 JSON,你也不能在 Alamofire 中这样做。所以基本上,Alamofire 会在后台处理它。因此,您不得不发送字典并使用 Alamofire 的简洁功能。

【讨论】:

【参考方案2】:

来自Alamofire documentation:

let parameters = [
    "foo": [1,2,3],
    "bar": [
        "baz": "qux"
    ]
]

Alamofire.request(.POST, "http://httpbin.org/post", parameters: parameters, encoding: .JSON)

您创建一个表示您的 JSON 的数组,然后将 encoding 参数设置为 Alamofire.JSON。 SwiftyJSON 与这里无关,因为它只处理反序列化 JSON 响应。

【讨论】:

以上是关于轻松将对象序列化为 JSON的主要内容,如果未能解决你的问题,请参考以下文章

将 Python 字典序列化为 XML [关闭]

将 PHP 对象图序列化/反序列化为 JSON

使用 Json.net 将 JSON 对象反序列化为动态对象

将JSON对象反序列化为嵌套的C#对象

将 JSON 反序列化为匿名对象

将 Objective-C 对象序列化和反序列化为 JSON