2013-01-14 171 views
1

我正在嘗試在電子郵件鏈接中發送對象的JSON表示。收件人將打開鏈接,我的應用程序將通過url方案進行響應。它必須從url中提取JSON並重新構建該對象。通過URL發送JSON NSData

我通過構建一個NSDictionary,並使用序列化我的對象:

return [NSJSONSerialization dataWithJSONObject:dictionary options:NSJSONWritingPrettyPrinted error:&error]; 

我不知道下一步怎麼走。不知何故,我需要將這個NSData轉換成一個字符串,以便我可以在我的url方案前綴並在鏈接中使用它。

在接收端,我需要刪除前綴(我可以這樣做)並將字符串轉回到NSData

這樣做的正確方法是什麼?我如何確保數據的內容不會干擾JSON字符串編碼(例如,如果我的對象包含包含特殊字符的文本)?

回答

1

您需要執行額外的編碼步驟,因爲編碼的JSON中有字符,當它們是URL的一部分時也具有重要意義。我們實際上想要做的是URL編碼數據,所以結果字符串中的字符都不會與應用程序期望URL的外觀相沖突。

的第一步是將我們的數據爲NSString(這基本上是一個memcpy的,因爲NSStrings在UTF-8默認編碼):

NSString *jsonString = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; 

現在,有可能會被誘惑的功能使用名爲-stringByAddingPercentEscapesUsingEncoding,但它並沒有徹底逃脫所有相關角色的工作,所以我們需要建立自己的角色。

我可以在這裏重複代碼,但由於已經完成很多次了,所以just view this blog會顯示如何將類別添加到NSString以進行正確的編碼,然後您可以將其附加併發送。使用CFURLCreateStringByReplacingPercentEscapesUsingEncoding編寫類似的解碼函數是讀者的一個練習,其中可以找到許多例子。

順便說一下,請確保您的有效載荷非常小(大小約爲幾kB),因爲可能存在URL的長度上限,即使在本地使用並使用自定義方案的URL可能長。