错误Json:“结束时的NSDebugDescription垃圾”(iOS)

时间:2014-05-02 13:34:34

标签: ios objective-c json parsing

你好,

即使我做了研究,我发现在我的情况下也无法帮助我。

所以,我尝试解析在xcode上由php脚本创建的Json,但是我有一个阻止该过程的错误。

我是新手,所以我尽力为我的问题布局做好准备......

我的错误:

[376:70b] Error Domain=NSCocoaErrorDomain Code=3840 "The operation couldn’t be completed. (Cocoa error 3840.)" (Garbage at end.) UserInfo=0x8bc0f70 {NSDebugDescription=Garbage at end.

我的代码:

NSData *jsonSource = [NSData dataWithContentsOfURL:
                          [NSURL URLWithString:@"http://codlobbyz.com/app/service.php"]];
    NSError *err;
    id jsonObjects = [NSJSONSerialization JSONObjectWithData:
                      jsonSource options:NSJSONReadingMutableContainers error:&err];
    NSLog(@"%@", err);

我的json:

[{"nom":"Call of duty ghost","date":"22 novembre","image":"appicon.png"},{"nom":"Fifa 14","date":"22 novembre","image":"appicon.png"}]

我希望你能帮助我,谢谢你的答案。

2 个答案:

答案 0 :(得分:12)

PHP脚本返回JSON,但也是一小段跟随它的HTML:

[{"nom":"Call of duty ghost","date":"22 novembre","image":"appicon.png"},{"nom":"Fifa 14","date":"22 novembre","image":"appicon.png"}] 
<!-- Hosting24 Analytics Code -->
<script type="text/javascript" src="http://stats.hosting24.com/count.php"></script>
<!-- End Of Analytics Code -->

您可以通过命令行使用curl来查看:

curl http://codlobbyz.com/app/service.php

或者在浏览器中加载并查看来源。

如果您可以控制PHP脚本,请删除分析代码。否则,您可以在解析之前使用正则表达式删除响应的非JSON部分。

编辑:要使用正则表达式远程处理非JSON,这样的东西可以工作:

NSString *json = @"[{\"nom\":\"Call of duty ghost\",\"date\":\"22 novembre\",\"image\":\"appicon.png\"},{\"nom\":\"Fifa 14\",\"date\":\"22 novembre\",\"image\":\"appicon.png\"}]\n<!-- Hosting24 Analytics Code -->\n<script type=\"text/javascript\" src=\"http://stats.hosting24.com/count.php\"></script>\n<!-- End Of Analytics Code -->";
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"\\s+<!--.*$"
                                                                       options:NSRegularExpressionDotMatchesLineSeparators
                                                                         error:nil];
NSTextCheckingResult *result = [regex firstMatchInString:json
                                                 options:0
                                                   range:NSMakeRange(0, json.length)];
if(result) {
    NSRange range = [result rangeAtIndex:0];
    json = [json stringByReplacingCharactersInRange:range withString:@""];
    NSLog(@"json: %@", json);
}

答案 1 :(得分:0)

如果您查看原始数据,您会发现&#39; 0&#39; 0在里面删除它我用了以下的循环

NSData *objectData = [jsonStr  dataUsingEncoding:NSUTF8StringEncoding];
            NSError *error;
            id json = [NSJSONSerialization JSONObjectWithData:objectData options:NSJSONReadingMutableContainers error:&error];
            if (json == nil) {
                int index = 0;
                const char *bytes = [data bytes];
                for (int i = (int)data.length-1; i > 0; i--) {
                    unsigned char ch = (unsigned char)bytes[i];
                    NSLog(@"%02hhx", ch);
                    if (ch != 0) {
                        index = i+1;
                        break;
                    }
                }

                NSRange dataRange = NSMakeRange(0, index);
                json = [NSJSONSerialization JSONObjectWithData:[objectData subdataWithRange:dataRange] options:NSJSONReadingMutableContainers error:&error];
            }

这会切断所有&#39; 00&#39;来自数据末尾的字节。