我向Instapaper API发出请求,它应该返回JSON。它返回接近JSON的东西,但不完全,如下所示:
2013-05-30 19:54:20.155 --[53078:c07] (
{
type = meta;
},
{
"subscription_is_active" = 1;
type = user;
"user_id" = --;
username = "--@gmail.com";
},
{
"bookmark_id" = 387838931;
description = "";
hash = YHwQuwhW;
"private_source" = "";
progress = 0;
"progress_timestamp" = 0;
starred = 0;
time = 1369954406;
title = "Adobe Finally Releases Kuler Color-Picking App for iPhone - Mac Rumors";
type = bookmark;
url = "http://www.macrumors.com/2013/05/30/adobe-finally-releases-kuler-color-picking-app-for-iphone/";
},
我该如何处理?我可以把它变成NSDictionary,即使它看起来不是有效的JSON吗?
答案 0 :(得分:2)
Instapaper字符串总是以UTF-8编码,而Instapaper期望所有输入都是UTF-8。 除非另有说明,否则每个方法的输出都是一个数组。默认情况下,输出数组以JSON形式返回。 您可以使用回调函数名称指定jsonp参数,例如jsonp = myCallback,使用JSONP并在对指定函数的调用中包装输出。
所以你无法获得无效的JSON!
请尝试以下代码:
NSData *jsonData = [[NSString stringWithContentsOfURL:[NSURL urlWithString:@"http://your-instapeper-API-link"] encoding:NSUTF8StringEncoding error:nil] dataUsingEncoding:NSUTF8StringEncoding];
NSError *error;
id serializationJSON = [NSJSONSerialization JSONObjectWithData:jsonData options:NSJSONReadingMutableContainers error:&error];
然后您可以记录错误或结果是否符合预期:
NSLog(@"class of JSON input: %@ \n and possible error: %@",[serializationJSON class],error);
当然你应该期待Array并且没有错误。
根据docs,你应该得到数组或字典。请添加此核心而不是第23行(来自here的数字):
if([JSON isKindOfClass:[NSDictionary class]]) {
NSDictionary *jsonDictionary = JSON;
NSLog(@"%@",[jsonDictionary allKeys]);
} else {
NSLog(@"JSON object class: %@",[JSON class]);
}
请告诉我们输出。
你从请求中得到数组。大!这是一个有效的JSON。所以你需要调试它。正如我所说,这是一个耻辱不是无限制的公共API,所以我可以调查一下。但现在你必须调试你的结果。我在您的代码中看到您正在尝试访问书签。所以我看看Bookmarks section in docs,这是某种列表(NSArray)。所以如果你不知道你想要什么结果。您应该将它们打印到日志中(或设置断点)。用这个简单的日志替换我之前更新中的代码:
NSDictionary *resultDictionary;
if([JSON isKindOfClass:[NSArray class]]) {
NSArray *jsonArray = JSON;
NSLog(@"so json is an array with %i objects",[jsonArray count]);
for(id objectInsideArr in jsonArray) {
NSLog(@"object in array [class]: %@ [value]: %@",[objectInsideArr class],objectInsideArr); //if here you find NSDictionary maybe is this dictionary you are looking for. I'm not sure what it is.
if([objectInsideArr isKindOfClass:[NSDictionary class]]) {
resultDictionary = [[NSDictionary alloc] initWithDictionary:objectInsideArr];
}
}
}
答案 1 :(得分:-1)
如果是我,我会编写一个自定义格式化程序,将其转换为JSON格式,然后在我知道它有效后再使用NSJSONSerialization。你发布的内容到目前为止还没有任何效果。我很惊讶他们以这种格式返回它,他们是否提供了某种用于消费服务的库?
答案 2 :(得分:-1)
如果你想要更简单的东西,我可以给你我的CGIJSONObject
库,它将使用反射来处理JSON - 你只需要用你的类镜像API中的键,这样就好了。