在Objective C中解析流式JSON

时间:2014-08-12 12:31:01

标签: objective-c json

我在TCP上使用JSON-RPC,问题是我找不到能够正确解析多个JSON对象的任何JSON解析,并且拆分它会相对困难,因为没有使用分隔符。

任何人都知道如何处理,即:

{"foo":false, "bar: true, "baz": "cool"}{"ba

不知何故,我需要拆分它,所以我最终只使用第一个完整的JSON对象。剩余的字符串需要保留在缓冲区中,直到我有足够的数据来正确解析它。

2 个答案:

答案 0 :(得分:1)

XBMC's JSON-RPC doc确实给出了提示:

  

因此,您的客户需要能够处理此问题,例如。通过计算和匹配花括号({})

更新:正如Jody Hagins指出的那样,在使用此方法时请注意JSON字符串中的花括号。

另一个可能的,可能更好的解决方案是使用流式JSON解析器,如yajl(或其Objective-C包装器yajl-objc)。您可以向解析器提供数据,直到它说完当前对象,然后重新开始解析。

答案 1 :(得分:-1)

@ePirat,如果有人只是连接多个没有分隔符的JSON词典,那么它们应该被拍摄。

用于解析:JSONSerialization解析可能带有任何编码的NSData。幸运的是,如果你连接了多个JSON字典,它们很容易拆开。您只需查看字节并检查字符\“{和}。

如果找到{然后增加“开放式括号”的计数器。 如果找到},则减少“打开括号”的计数器。如果计数器为零,你就找到了字典的结尾。

如果找到“,则反复查看下一个字符。如果下一个字符是”,则跳过它并进入正常处理(您已找到字符串的结尾)。如果下一个字符是\,则跳过该字符和后续字符。如果下一个字符是其他任何字符,请跳过它。

如果到达数据末尾,那么您的JSON数据就不完整了。您可以记住您所处的状态(开括号的数量,是否正在解析字符串,以及解析字符串是否只是遇到反向字符)并继续向右中断。

在将NSData分成字典之前,无需将NSData转换为字符串。如果您怀疑可能获得UTF-16或UTF-32,请检查字节0,1,2或1,2,3是否为零(UTF-32),然后检查字节0和2或1和3是否为0零(UTF-16)。但在这种情况下,如果服务器以UTF-16或UTF-32发送非标准JSON,则将“负责人应该被枪杀”改为“必须负责人”。