通过URL发送JSON NSData

时间:2013-01-14 21:54:20

标签: iphone ios objective-c json cocoa

我正在尝试在电子邮件链接中发送对象的JSON表示。收件人将打开链接,我的应用程序将通过网址方案回复。它必须从url中提取JSON并重新构建对象。

我通过构建NSDictionary并使用:

来序列化我的对象
return [NSJSONSerialization dataWithJSONObject:dictionary options:NSJSONWritingPrettyPrinted error:&error];

我不确定接下来会发生什么。不知何故,我需要将此NSData转换为字符串,以便我可以为我的url方案添加前缀并在链接中使用它。

在接收端,我需要删除前缀(我可以做)并将字符串转回NSData

这样做的正确方法是什么?如何确保我的数据内容不会干扰JSON字符串编码(例如,如果我的对象包含包含特殊字符的文本)?

1 个答案:

答案 0 :(得分:1)

您需要执行额外的编码步骤,因为编码的JSON中的字符在作为URL的一部分时也具有重要性。我们实际想要做的是 URL-encode 数据,因此生成的字符串中的所有字符都不会与应用程序期望URL看起来相冲突。

第一步是将我们的数据转换为NSString(这基本上只是一个memcpy,因为NSStrings默认以UTF-8编码):

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

现在,有一个你可能想要使用的函数叫-stringByAddingPercentEscapesUsingEncoding,但它没有做足够彻底的工作来逃避所有相关的角色,所以我们需要建立自己的。

我可以在这里重复代码,但由于它已经多次完成,just view this blog显示了如何向NSString添加类别以进行正确的编码,之后您可以将其附加到发送它的方式。用CFURLCreateStringByReplacingPercentEscapesUsingEncoding编写类似的解码函数是读者的练习,其中可以找到许多例子。

确保您的有效负载非常小(大约几KB),顺便说一句,因为URL可能是一个上限,即使是本地和自定义方案使用的URL也可以。