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

时间:2014-01-17 15:13:33

标签: ios objective-c

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

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

{
    "id": "156806",
    "type": "message",
    "userCity": "",
    "userCountry": "",
    "os": "",
    "browser": "",
    "trafficType": "",
    "seKeyword": "",
    "seType": "",
    "currentPage": "",
    "userId": "1",
    "agentId": "352",
    "customField1": "",
    "visitorNick": "Visitor 147220060",
    "msg": "asd",
    "time": "16:05",
    "channel": "V147220060",
    "visits": "254"
} {
    "type": "previewStopped",
    "msg": "",
    "visitorNick": "Mackan",
    "customField1": "",
    "visitorNick": "Visitor V147220060",
    "time": "16:05",
    "channel": "V147220060"
} {
    "id": "156807",
    "type": "message",
    "userCity": "",
    "userCountry": "",
    "os": "",
    "browser": "",
    "trafficType": "",
    "seKeyword": "",
    "seType": "",
    "currentPage": "",
    "userId": "1",
    "agentId": "352",
    "customField1": "",
    "visitorNick": "Visitor 147220060",
    "msg": "as",
    "time": "16:05",
    "channel": "V147220060",
    "visits": "254"
} {
    "id": "156808",
    "type": "message",
    "userCity": "",
    "userCountry": "",
    "os": "",
    "browser": "",
    "trafficType": "",
    "seKeyword": "",
    "seType": "",
    "currentPage": "",
    "userId": "1",
    "agentId": "352",
    "customField1": "",
    "visitorNick": "Visitor 147220060",
    "msg": "da",
    "time": "16:05",
    "channel": "V147220060",
    "visits": "254"
}

以下是我目前解析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时,上述工作非常有效,但它会出错:

  

PARSE ERROR ------------->>>>> :错误域= NSCocoaErrorDomain   代码= 3840"操作无法完成。 (可可误差3840。)"   (最后的垃圾。)UserInfo = 0x14e9acb0 {NSDebugDescription = Garbage at   端。}

任何想法如何处理?

4 个答案:

答案 0 :(得分:1)

嗯......你可以自己包装。获取您获得的数据并将"{ "dataarray": ["添加到开头,并"] }"添加到结尾。这将生成一个数组,其元素将是您的个人JSON实体。

答案 1 :(得分:0)

试试这个:

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";
}

希望它有所帮助!

答案 2 :(得分:0)

这是错误的,因为你的字符串中没有有效的JSON。您需要执行以下操作才能使其格式正确:

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

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

假设outputDataNSString

答案 3 :(得分:0)

如果您的数据流按顺序包含多个JSON,则严格不再是JSON。相反,它是嵌入JSON的自定义协议。

您需要先定义自定义协议。它可以按顺序定义为任意数量的JSON - 如果这符合您的需要。 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对象中。