iOS - JSON数据不起作用

时间:2014-01-06 15:29:45

标签: ios json api http get

我正在尝试从此API获取JSON数据,但是我收到错误:错误域= NSCocoaErrorDomain代码= 3840"操作无法完成。 (可可误差3840。)" (字符0周围的值无效。)UserInfo = 0x8b5aa20 {NSDebugDescription =字符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);
}

任何人都可以告诉我为什么会收到此错误。该代码正在使用其他Web的JSON数据。

2 个答案:

答案 0 :(得分:3)

API没有返回格式良好的JSON,因此无法解析。

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

答案 1 :(得分:3)

您的API根本不会返回JSON,而是打印出漂亮的PHP数组:

编辑:在PHP手册中,一个社区成员创建了与print_r相反的部分(在PHP中用于创建您获得的数据)。

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
        }
    }
]