如何反序列化JSONP

时间:2015-01-07 00:58:13

标签: ios objective-c jsonp

我使用JSON和反序列化服务如下:

NSString *filtered = [restConnection stringData];
encodData = [filtered dataUsingEncoding:NSUTF8StringEncoding];
json = [NSJSONSerialization JSONObjectWithData:encodData options:0 error:nil];
NSLog(@"json 1: %@", json);

但是现在一个新客户端使用JSONP,或者JSON使用填充服务而不是序列化它,你能帮我吗

这是一个字符串JSON标准:

NSString *  @"[{\"CodigoRTA\":\"91\",\"MensajeRTA\":\"Error de Inicio de sesión: Error con la validación de seguridad de la clave para el inicio de sesión\",\"Respuesta\":\"\"}]"

NSString *  @"\[{\\\"CodigoRTA\\\":\\\"91\\\",\\\"MensajeRTA\\\":\\\"Error de Inicio de sesión: Error con la validación de seguridad de la clave para el inicio de sesión\\\",\\\"Respuesta\\\":\\\"\\\"}]\""

这是JSONP的例子:

NSString *  @"\"[{\\\"CodigoRTA\\\":\\\"91\\\",\\\"MensajeRTA\\\":\\\"Error de Inicio de sesión: Error con la validación de seguridad de la clave para el inicio de sesión\\\",\\\"Respuesta\\\":\\\"\\\"}]\""

1 个答案:

答案 0 :(得分:0)

这是你从JSON获得JSONP的方法:

NSString *jsonp = [NSString stringWithFormat: @"%@(%@)", callbackName, json];

callbackName通常是callback参数的值,或@"callback")。

如果你需要 de 序列化JSONP,只需删除第一个(及其前面的所有内容,然后删除),然后获得JSON;很容易用正则表达式。

编辑:此外,我不确定我会称之为什么,但它不是JSON:

@"[{\\"CodigoRTA\\":\\"91\\",\\"MensajeRTA\\":\\"Error de Inicio de sesión: Error con la validación de seguridad de la clave para el inicio de sesión\\",\\"Respuesta\\":\\"\\"}]\""

这也不是JSONP(但至少我可以说它是什么:JSON编码的JSON):

@"\"[{\\"CodigoRTA\\":\\"91\\",\\"MensajeRTA\\":\\"Error de Inicio de sesión: Error con la validación de seguridad de la clave para el inicio de sesión\\",\\"Respuesta\\":\\"\\"}]\""

与您的第一个(正确的)JSON对应的JSONP是:

@"callback([{\"CodigoRTA\":\"91\",\"MensajeRTA\":\"Error de Inicio de sesión: Error con la validación de seguridad de la clave para el inicio de sesión\",\"Respuesta\":\"\"}])"

EDIT2: JSONP到JSON应该是这样的(我不擅长ObjC,所以你可能需要调试它):

NSRegularExpression *regex =
    [NSRegularExpression regularExpressionWithPattern:@"\\((.*)"
                                              options: NSRegularExpressionDotMatchesLineSeparators
                                              error:NULL];

NSTextCheckingResult *searchResult =
    [regex firstMatchInString:jsonp
                      options:0
                        range:NSMakeRange(0, [jsonp length])];

NSString *json = [json substringWithRange:searchResult.range];