【问题标题】:Why is Objective-C converting JSON values to a hash of ASCII character codes?为什么 Objective-C 将 JSON 值转换为 ASCII 字符代码的散列?
【发布时间】:2011-04-04 01:19:00
【问题描述】:

我们正在构建一个 iPhone 聊天应用程序。

从浏览器向 iPhone 发送 JSON 聊天消息时:

    {"content":"Hi"}

iPhone 收到:

    {"content":{"0":72,"1":105,"length":2}}

但是,我们打算让它接收相同的确切消息。

要重现此问题,请先安装 node.js 和 redis。那么:

  • 获取代码:

    git clone git://github.com/acani/acani.git
    cd acani
    git submodule update --init
    
  • 在默认端口上启动 Redis。

  • 来自http://github.com/acani/acani-node

    node acani-node-server.js # run node.js chat server
    # open index.html in a Google Chrome or Firefox and follow instructions.
    
  • 打开位于http://github.com/acani/acani-chat/tree/master/Lovers2/ 的 Lovers.xcodeproj,并将 LoversAppDelegate.m 更改为初始加载 ChatViewController 而不是 HomeViewController。

    homeViewController = [[HomeViewController alloc] init]; # comment out this line
    # change the next line to:
    navigationController = [[UINavigationController alloc] initWithRootViewController:[[ChatViewController alloc] init]];
    # Then, build & run.
    

【问题讨论】:

  • 您能在实际解析 JSON 的位置显示相关的 Objective-C 代码吗?你用的是什么 JSON 框架?
  • 这不是将 JSON 字符串转换为 NSDictionary;这样可行。我知道是因为我在这行后面放了一个 NSLog:github.com/acani/acani-chat/blob/master/Lovers2/…,它表明 JSON 字符串的值的字符已被转换为 ASCII 码。

标签: iphone network-programming node.js redis asyncsocket


【解决方案1】:

我们想通了。它根本不是 iPhone 或 Objective-C。转换错误发生在 node.js 服务器上。我们忘记在 JSON 对象的字符串值周围加上引号,因此 JSON.stringify() JavaScript 函数正在转换字符串,如上所示...除了我们正在执行类似:{"content":Hi} 的操作。当我们将其更改为:{"content":"Hi"} 时,它运行良好。呃……

【讨论】:

    【解决方案2】:

    我的猜测是您需要使用 stringByAddingPercentEscapesUsingEncoding 转义正在发送的字符串 (JSON),然后在收到时取消转义。

    前三个数字是 072 - 在十进制中是“H”。这让我觉得一个“可能会因为没有编码的传输而丢失。还有其他反对这个理论的东西,但我认为它值得一看。

    【讨论】:

    • 这是有道理的。谢谢。我今晚会试试,然后回来报告。我想我认为 AsyncSocket 库会解决这个问题......
    猜你喜欢
    • 1970-01-01
    • 2011-02-19
    • 1970-01-01
    • 2016-06-21
    • 2013-09-27
    • 1970-01-01
    • 1970-01-01
    • 2011-11-15
    • 1970-01-01
    相关资源
    最近更新 更多