当我的应用同时收到多个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 端。}
任何想法如何处理?
答案 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];
假设outputData
是NSString
。
答案 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
对象中。