0

我认识到已经有很多关于此的 SO 主题,但它们似乎都已经过时了。

IE: SBJSON 解析问题与 Twitter 的 GET 趋势/:woeidJSONValue ARC 问题

但是,我的 JSON 响应有点不同。

这是原始字符串(从 Django 后端创建):

 [
  {"user":  "[
              {\"id\": \"48\"}, 
              {\"email_address\": null}, 
              {\"password\": \"f41fd61838bc65d6b2c656d488e33aba\"}, 
              {\"salt\": \"24\"}, 
              {\"date_created\": \"2013-01-27 07:59:26.722311+00:00\"},
              {\"date_modified\": \"2013-01-27 07:59:26.722357+00:00\"}, 
              {\"is_deleted\": \"False\"}
            ]"
   }
 ]

"user":阻止我仅使用 SBJson 和它的 SBJSonParser 和/或 Apple NSJSONSeriliazatoin 类 + 方法的事情是第二个之后和之前的两个引号[(以及它的引号表亲,在倒数第二个之后])。

NSMutableString这些引号在转换为 JSON 对象时会混淆上述两种解决方案。

在删除有问题的引号和/或有效处理它们的 JSON 解析库方面有什么建议/解决方案?

NSScanner也许一些NSMutableString类方法,但没有什么特别明显的东西出现在我的脑海中。

寻找一个简单新颖的解决方案。

4

2 回答 2

1

您显示的 JSON 有点......无效......上面是嵌套的 JSON:

  1. 带有用户键的 dict 数组 == 另一个 JSON 的字符串
  2. 具有 n 个 JSON 字典的数组

我猜它可以分两步解析......

    id s = @"[ \n \
            {\"user\": \"[%@]\" \n \
            } \n \
     ]";
    id s2 = @"{\\\"id\\\": \\\"48\\\"},{\\\"email_address\\\": \\\"null\\\"},{\\\"password\\\": \\\"f41fd61838bc65d6b2c656d488e33aba\\\"},{\\\"salt\\\": \\\"24\\\"},{\\\"date_created\\\": \\\"2013-01-27 07:59:26.722311+00:00\\\"},{\\\"date_modified\\\": \\\"2013-01-27 07:59:26.722357+00:00\\\"},{\\\"is_deleted\\\": \\\"False\\\"}";
    s = [NSString stringWithFormat:s,s2];
    id d = [s dataUsingEncoding:NSUTF8StringEncoding];
    NSLog(@"\n%@ %@", s, d);
    NSError *error = nil;
    id outerJSON = [NSJSONSerialization JSONObjectWithData:d options:0 error:&error];
    if(!outerJSON && error) {
        NSLog(@"%@", error);
        return -1;
    }
    NSLog(@"\n%@", outerJSON);

    s = [[outerJSON objectAtIndex:0] objectForKey:@"user"];
    d = [s dataUsingEncoding:NSUTF8StringEncoding];
    id innerJSON = [NSJSONSerialization JSONObjectWithData:d options:0 error:&error];
    if(!innerJSON && error) {
        NSLog(@"%@", error);
        return -1;
    }
    NSLog(@"\n%@", innerJSON);
于 2013-01-27T09:28:27.127 回答
1

就像其他人所说的那样,这不是有效的 JSON。在后端修复它是最好的解决方案,但如果你不能 - 这应该适合你:

NSString *dJangoString = @"[{\"user\":  \"[{\"id\": \"48\"},{\"email_address\": null},{\"password\":\"f41fd61838bc65d6b2c656d488e33ab\"},{\"salt\": \"24\"},{\"date_created\": \"2013-01-27 07:59:26.722311+00:00\"},{\"date_modified\": \"2013-01-27 07:59:26.722357+00:00\"},{\"is_deleted\": \"False\"}]\"}]\"";

dJangoString = [dJangoString stringByReplacingOccurrencesOfString:@"\"[" withString:@"["];
dJangoString = [dJangoString stringByReplacingOccurrencesOfString:@"]\"" withString:@"]"];

NSData* dJangoData = [dJangoString dataUsingEncoding:NSUTF8StringEncoding];
NSError *error = nil;
id retObj = [NSJSONSerialization JSONObjectWithData:dJangoData options:0 error:&error];

NSLog(@"retObj = %@", [retObj description]);
于 2013-01-27T13:51:22.920 回答