【问题标题】:How to process response from Instapaper API?如何处理来自 Instapaper API 的响应?
【发布时间】:2013-05-30 23:02:25
【问题描述】:

我向 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/";
    },

然后我该如何处理呢?即使它似乎不是有效的 JSON,我是否可以将其转换为 NSDictionary?

【问题讨论】:

标签: ios objective-c json api instapaper


【解决方案1】:

来自Instapaper API Docs

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

【讨论】:

  • 很抱歉,我不确定如何使用您提供的代码。这是我用来检索我得到的响应的代码:gist.github.com/anonymous/a7eee82f03131ec17b3d 我不确定我是否可以在不提供令牌和您提供的 URL 的情况下发出 API 请求,但如果我能做更多,请说吧。
  • 是的,你是对的。我不知道您必须发送 POST 请求,而且我现在无法生成 Instantpaper 密钥(管理员必须发送它)。但是您使用的是来自AFNetwortingAFXAuthClient(老实说,在iOS 5 和NSJSONSerialization 之后我不是一个忠实的粉丝)。但我编辑我的答案。请给出这个输出。
  • JSON object class: __NSCFArray 是输出。
  • 太棒了!所以这是一个有效的 JSON。我更新我的答案。这应该对您有所帮助。
  • 太好了,所以日志object in array [class]: __NSCFDictionary 告诉你你有一个有效的NSDictionary。我在答案中编辑了两行代码。如果您只有一行字典变量 resultDictionary 将包含您的预期结果。
【解决方案2】:

如果是我,我会编写一个自定义格式化程序将其转换为 JSON 格式,然后在我知道它有效后使用 NSJSONSerialization。您发布的内容远非有效,它无法正常工作。我很惊讶他们以这种格式返回它,他们是否提供某种库来使用他们的服务?

【讨论】:

  • 不,他们不提供任何库。 instapaper.com/api/full 在那个页面上,它似乎奇怪地返回了有效的 JSON。
  • 我正在考虑使用正则表达式来删除除我需要的位(书签 ID 和 URL)之外的所有内容,然后使用仅包含这些详细信息的新字符串并对其进行操作。
  • 奇怪的是,他们记录的内容和您在通话中得到的内容是两种不同的格式。我会看看这是否是他们的结局。你真的应该得到有效的 JSON。如果您必须让它最终工作,只需进行字符串操作,直到它是有效的 JSON。即用冒号替换等于,删除分号,添加左括号和右括号,并将键值对包装在引号中。但老实说,这是一项繁重的工作和一个容易出错的过程,所以我会先与他们核实一下,为什么您的调用返回的格式无效。
【解决方案3】:

如果您想要更简单的东西,我可以为您提供我的 CGIJSONObject 库,该库将使用反射处理 JSON - 您只需将 API 中的键与您的类一起镜像即可。

【讨论】:

    猜你喜欢
    • 2021-03-26
    • 2019-04-25
    • 1970-01-01
    • 2013-08-27
    • 2015-01-26
    • 2021-03-30
    • 1970-01-01
    • 2011-08-22
    • 2020-04-05
    相关资源
    最近更新 更多