iOS - JSON数据无法正常工作

3

我尝试从这个API获取JSON数据,但是遇到了错误:Error Domain=NSCocoaErrorDomain Code=3840 "The operation couldn’t be completed. (Cocoa error 3840.)" (Invalid value around character 0.) UserInfo=0x8b5aa20 {NSDebugDescription=Invalid value around character 0.}

这是代码:

NSString *post = [NSString stringWithFormat:@"http://api.reittiopas.fi/hsl/1_1_2/?request=reverse_geocode&user=********&pass=********&format=txt&coordinate=2548196,6678528"];

NSError *error = nil;

NSString* newStr = [NSString stringWithContentsOfURL:[NSURL URLWithString:post] encoding:NSUTF8StringEncoding error: &error];
NSData *jsonDataString = [newStr dataUsingEncoding:NSUTF8StringEncoding];
NSLog(@"%@", jsonDataString.description);

NSMutableDictionary *allResults = [NSJSONSerialization
                                   JSONObjectWithData:jsonDataString
                                   options:NSJSONReadingAllowFragments
                                   error:&error];

if(!error){
    NSLog(@"%@", allResults.description);
}
else{
    NSLog(@"%@", error.description);
}

有人能告诉我为什么会出现这个错误吗?该代码在其他网站的JSON数据上能够正常运行。


使用 [NSData dataWithContentsOfUrl:...] - k06a
3
但是响应并不是JSON。 - Desdenova
请看我的第二次编辑,我创建了一个GitHub仓库,其中包含一个类,可以解决你的挑战:https://github.com/julian-weinert/JWPrettyPrintedSerialization - Julian F. Weinert
为了帮助您更方便地操作,您只需将 API 地址中的 format=txt 改为 format=json 即可。我已经测试过,这样可以正常工作。 - Julian F. Weinert
2个回答

4
您的API并没有返回JSON格式的数据,而是返回了经过漂亮打印的PHP数组: 编辑: 在PHP手册上,一位社区成员创建了一个相反的函数来解析print_r(该函数用于创建您获得的数据)。 http://www.php.net/manual/en/function.print-r.php#93529 您可以将此函数翻译为Objective-C语言。 编辑II: 我创建了一个类来解决您的问题。您可以在GitHub上获取当前分支。 漂亮打印的数组:
Array
(
    [0] => Array
        (
            [locType] => address
            [locTypeId] => 900
            [name] => Purotie 8, Helsinki
            [matchedName] => 
            [lang] => fi
            [city] => Helsinki
            [coords] => 2548220,6678497
            [distance] => 39.2045915678253
            [details] => Array
                (
                    [houseNumber] => 8
                )
        )
)

JSON:

[{"locType": "address", "locTypeId": 900, "name": "Purotie 8, Helsinki", "matchedName": "", "lang": "fi", "city": "Helsinki", "coords": "2548220,6678497", "distance": "39.2045915678253", "details": {"houseNumber": 8}}]

美化后的JSON:

[
    {
        "locType": "address",
        "locTypeId": 900,
        "name": "Purotie 8, Helsinki",
        "matchedName": "",
        "lang": "fi",
        "city": "Helsinki",
        "coords": "2548220,6678497",
        "distance": "39.2045915678253",
        "details": {
            "houseNumber": 8
        }
    }
]

3

API没有返回规范的JSON格式数据,导致无法解析。

您可以使用类似http://jsonlint.com/这样的网站来确认API输出格式不正确,因此无法被NSJSONSerialization解析。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接