具有多个JSON对象的iOS解析字符串?

具有多个JSON对象的iOS解析字符串?,ios,objective-c,Ios,Objective C,当我的应用程序同时接收多个JSON对象时,我遇到了一些麻烦。我使用的TCP套接字对发送消息的服务器开放。我似乎收到多条消息的原因可能是由于网络延迟 这就是服务器消息的样子(然后我将其放入NSString并尝试解析JSON): 下面是我当前解析NSString的方式,注意上面的JSON是下面代码中的outputData: // Parse the message from the server NSError* error;

当我的应用程序同时接收多个JSON对象时,我遇到了一些麻烦。我使用的TCP套接字对发送消息的服务器开放。我似乎收到多条消息的原因可能是由于网络延迟

这就是服务器消息的样子(然后我将其放入NSString并尝试解析JSON):

下面是我当前解析NSString的方式,注意上面的JSON是下面代码中的
outputData

            // Parse the message from the server
            NSError* error;
            NSDictionary *JSON =
            [NSJSONSerialization JSONObjectWithData: [outputData dataUsingEncoding:NSUTF8StringEncoding]
                                            options: NSJSONReadingMutableContainers
                                              error: &error];


            NSString* type = [JSON objectForKey:@"type"];

            if(error) {
                NSLog(@"PARSE ERROR ------------->>>>> : %@\n", error);
            }

            NSLog(@"SERVER TYPE --> %@\n", type);

            if([type isEqualToString:@"message"]) {                    
                [self messageReceived:outputData];
            }
当我在
outputData
中只接收到一个JSON时,上述方法非常有效,但当接收到多个JSON时,会出现错误:

分析错误---------------->>>:ERROR Domain=NSCocoaErrorDomain 代码=3840“操作无法完成。(Cocoa错误3840)。” (结尾处为垃圾。)UserInfo=0x14e9acb0{NSDebugDescription=结尾处为垃圾 完}


你知道怎么处理吗?

嗯……你可以自己包装。获取您获得的数据,并将“{”dataarray:[“放在开头,
“]}”
放在结尾。这将生成一个数组,其中的元素将是您的单个JSON实体。

尝试以下操作:

NSData *jsonData = [outputData dataUsingEncoding:NSUTF8StringEncoding];
NSArray *dict = [NSJSONSerialization JSONObjectWithData:jsonData options:0 error:&e];
NSDictionary *JSON = [dict objectAtIndex:0];
NSString* type = [JSON objectForKey:@"type"];
编辑:

JSON示例,因为您的“”可能会导致问题:

{
    aula = "AULA M04";
    cuatrimestre = "Primer quadrimestre";
    dia = Dimecres;
    edificio = "AULARI V";
    fin = "18:00";
    inicio = "15:00";
}

希望有帮助

它出错了,因为字符串中没有有效的JSON。您需要执行以下操作才能将其转换为正确的格式:

NSString *formattedString = [NSString stringWithFormat:@"[%@]", [outputData stringByReplacingOccurrencesOfString:@"} {" withString:@"},{"]];

NSError *error = nil;
NSArray *JSON = [NSJSONSerialization JSONObjectWithData:[formattedString dataUsingEncoding:NSUTF8StringEncoding] options:NSJSONReadingAllowFragments error:&error];

这是假设
outputData
是一个
NSString

如果您的数据流包含多个顺序的JSON,那么它就不再是JSON了。相反,它是一个嵌入JSON的自定义协议

您需要首先定义自定义协议。它可以被定义为任意数量的JSON序列-如果这符合您的需要<但是,code>NSJSONSerialization无法解析您的自定义协议

您可以以不同的方式定义协议,例如:您的数据是一个连续的消息流,其中消息是一个“blob”,前面有一个表示字节长度的值,例如:

message := message_size CRLF blob   

message_size   :=  digits

data :=   message*
也就是说,您的数据可能如下所示:

2\n\r[]4\n\r5["a"]
这当然是一个相当幼稚的协议,但它应该足以证明基本思想

然后,您的blob可以是JSON UTF-8


这个“协议”可以通过自定义解析器轻松解析,其中“blob”(单个JSON)将通过JSON解析器传递,可能被包装到一个
NSData
对象中。

您可以添加
[outputData dataUsingEncoding:NSUTF8StringEncoding]的输出吗?
在一个包中获得多个JSON实体是不常见的。通常,服务器将其封装到一个JSON数组中,多个实体是数组中的一个项。你能让服务器把你的JSON实体包装成一个单一的JSON结构吗?如果做不到这一点,您必须自己解析JSON,然后一次一个地将它们提供给解析器。@Yoeribo即使我不确定是否遵循,您希望我将哪个变量回显到控制台?尝试将
NSJSONReadingMutableContainers
更改为
NSJSONReadingAllowFragments
您的服务器返回错误信息,您发布的内容不是有效的json,应该用逗号分隔,并用数组括号[{“id”:1},{“id”:2}]包装。您还希望将结果分配到NSAray,而不是NSDictionary。验证json与jsonlint.com如果您忘记了}{bracketsys的逗号,您还应该查找}{并插入逗号,但是您应该匹配大括号,并且只在顶层执行。运行计数器以对每个{递增,对每个}递减并在计数器为零的位置插入逗号。您可以将数据转换为NSMutableString,该类将为您提供大量更改内容的方法。这在代码中会是什么样子?不完全确定如何写入它最简单的方法是对每个字符进行for循环。将变量初始化为零。当y遇到{时,递增变量,遇到}时,递减变量。当达到零时,表示已匹配开头{,因此,如果遇到后面的另一个{,则首先插入逗号。
2\n\r[]4\n\r5["a"]