2017-07-26 23 views
-2

私は実際、この内の次のクラス(実際のチャットのクラスでは、私は明確にするためにそれを単純化し、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にデータを変換したいです。 (私はSwiftyJSONでAlamofireを使用しています)ので、まず次のコードを使用してDictionaryに変換しました。 [ "ID"::3、 "トークン": "1321sjadb"、 "タイトル": "チャットタイトル3"]、0:

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":1、 "token": "aU7nanPu"、 "title": "チャットタイトル1"]、1:["id":2、 "token": "948dfjh4"、 "title": "チャットタイトル2 "]]

この出力をJSONに変換します。ここで私が試したものです。

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

これは私に私の質問は、私は有効なJSON文字列形式にresultDict変数を変換しないか、であるTerminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Invalid (non-string) key in JSON dictionary

を言うエラーが発生しますか?

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

現在作業中です。ありがとう:-) –

関連する問題