objective-c json 解析器:如何解析以字符串而不是括号开头的 json 文件?

Posted

技术标签:

【中文标题】objective-c json 解析器:如何解析以字符串而不是括号开头的 json 文件?【英文标题】:objective-c json parser: How to parse a json file starting with a string and not brackets? 【发布时间】:2015-05-02 04:35:09 【问题描述】:

我有一个如下所示的 JSON 文件:

test.Data(
  "field": "try", 
  "date": "20150501", 
  "data": [
    "<sample1 code_date=\"2015050110\" type=\"play\"><sample2 name=\"foo\" place=\"bar\">"]
);

我尝试使用以下方法阅读它:

NSString *urlAsString = [NSString stringWithFormat:@"localhost"];
NSURL *url = [[NSURL alloc] initWithString:urlAsString];
NSURLRequest *request = [NSURLRequest requestWithURL:url];
NSOperationQueue *queue = [[NSOperationQueue alloc] init];

[NSURLConnection sendAsynchronousRequest:request queue:queue completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) 
    if ([data length] > 0 && connectionError == nil)
        _textLabel.stringValue = @"Good";
    else if ([data length] == 0 && connectionError == nil)
        _textLabel.stringValue = @"Nothing to load";
    else if (connectionError != nil)
        _textLabel.stringValue = connectionError.userInfo[@"NSLocalizedDescription"];


    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^
        NSError *e = nil;
        NSArray *jsonArray = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error: &e];

        if (!jsonArray) 
            NSLog(@"Error parsing JSON: %@", e);
         else 
            for(NSDictionary *item in jsonArray) 
                NSLog(@"Item: %@", item);
            
        
    );

但我收到以下错误:

解析 JSON 时出错:Error Domain=NSCocoaErrorDomain Code=3840“无法读取数据,因为它的格式不正确。” (字符 0 周围的值无效。) UserInfo=0x61800006e880 NSDebugDescription=字符 0 周围的值无效。

知道如何使用标准 JSON 解析器将这种 JSON 格式读入 Xcode 吗?

【问题讨论】:

文件内容不是有效的 JSON,看起来更像是一个方法调用。 更新服务器以返回有效的 JSON。 NSURLConnection 请求完成处理程序已经在后台线程上运行时,为什么还要使用dispatch_async 在另一个后台线程上运行该代码? 我是这种方法的新手,我仍在阅读它。这部分代码来自一个教程。我想没有必要吧? 【参考方案1】:

我假设您想剥离方法调用并仅保留传递的 JSON 参数。如果您确定该文件只包含一个方法调用,而没有其他代码,尤其是带有花括号的代码,您可以应用以下逻辑:找到第一个和最后一个花括号,并使用该子字符串:

NSString *dataString = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
NSUInteger firstCurlyBracePos = [dataString rangeOfString:@"" options:0].location;
NSUInteger lastCurlyBracePos = [dataString rangeOfString:@"" options: NSBackwardsSearch].location;
NSString jsonString = nil;
if(firstCurlyBracePos != NSNotFound && lastCurlyBracePos != NSNotFound) 
    jsonString = [dataString substringWithRange:NSMakeRange(firstCurlyBracePos, lastCurlyBracePos-firstCurlyBracePos)];

jsonString 将保存文件的 JSON 部分,如果两个花括号中的至少一个未找到,则为 nil

【讨论】:

以上是关于objective-c json 解析器:如何解析以字符串而不是括号开头的 json 文件?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 SBJson 和 Objective-C 解析和提取嵌套的 JSON 响应

在 Objective-C 中解析 JSON 数组

是否有关于如何使用基于 C 的 YAJL 库解析简单 JSON 文件的简单示例?

在 IOS(Objective-C)中有效地解析 JSON 到 Realm DB

在 Objective-C 中解析 JSON 的最漂亮方法?

在 Objective-C 中解析 JSON 后的随机结果