2017-07-26 71 views
-2

我有下面的类(在实际Chat类是NSManagedObject,我简化它为清楚起见)Swift3 - 字典到JSON字符串

import Foundation 
class Chat: Hashable { 

    public var id: Int32? 
    public var token: String? 
    public var title: String? 

    var hashValue: Int { 
     return ObjectIdentifier(self).hashValue 
    } 

    static func ==(lhs: Chat, rhs: Chat) -> Bool { 
     return ObjectIdentifier(lhs) == ObjectIdentifier(rhs) 
    } 
} 

在这里,我初始化对象并将其存储在一组(在实际此取数据时使用的核心数据和类型总是Set。因此我试着复制同一类型)

let chat1 = Chat() 
chat1.id = 1 
chat1.token = "aU7nanPu" 
chat1.title = "Chat Title 1" 

let chat2 = Chat() 
chat2.id = 2 
chat2.token = "948dfjh4" 
chat2.title = "Chat Title 2" 

let chat3 = Chat() 
chat3.id = 3 
chat3.token = "1321sjadb" 
chat3.title = "Chat Title 3" 

var chats = Set<Chat>() 
chats.insert(chat1) 
chats.insert(chat2) 
chats.insert(chat3) 

我现在想将数据转换成JSON将其发送到服务器进行处理。 (我使用Alamofire和SwiftyJSON),因此我首先使用下面的代码将它转换为Dictionary。

var resultDict = [Int:Any]() 
for (index, chat) in chats.enumerated() { 
    var params = ["id" : chat.id!, "token": chat.token!, "title": chat.title!] as [String : Any] 
    resultDict[index] = params 
} 

这给了我下面的输出

[2: “ID”:3, “令牌”: “1321sjadb”, “称号”: “聊天标题3”],0: [“id”:1,“token”:“aU7nanPu”,“title”:“聊天标题1”],1:[“id”:2, “token”:“948dfjh4”,“title”标题2“]]

我现在要将此输出转换为JSON。这是我的尝试。

let jsonData = try! JSONSerialization.data(withJSONObject: resultDict, options: .prettyPrinted) 

这给了我该说Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Invalid (non-string) key in JSON dictionary

我的问题是错误的,我怎么转换resultDict变量为有效的JSON字符串格式?

PS:在情况下,如果有人想用代码来打球,这里是小提琴:https://swift.sandbox.bluemix.net/#/repl/597833e605543472066ad11e

+2

的错误信息是一清二楚:非字符串字典的键不JSON不允许的。如果它应该发送到服务器,不要*漂亮地打印*字符串。服务器不关心美学。 – vadian

回答

1

我相信resultDict需要它的关键是String类型。

let resultDict = [String:Any]() 

只是索引转换为字符串将它添加到字典

resultDict[String(index)] = params 
+0

谢谢!当我改变它时工作。 –

1

resultDict之前[Int:Any]型和JSONSerialization需要钥匙是strings https://developer.apple.com/documentation/foundation/jsonserialization/1413636-data了解更多详情。

我怎么转换resultDict变量为有效的JSON字符串格式

试试这个

var resultDict = [String:Any]() 
for (index, chat) in chats.enumerated() { 
    var params = ["id" : chat.id!, "token": chat.token!, "title": chat.title!] as [String : Any] 
    resultDict["\(index)"] = params 
} 
+0

立即工作。谢谢 :-) –