Как обработать ответ от Instapaper API?

Я делаю запрос к 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?

3 ответа

Решение

Из документов Instapaper API:

Строки 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 и без ошибок.

РЕДАКТИРОВАТЬ... на основе кода комментария:

На основе документов вы должны получить массив или словарь. Пожалуйста, добавьте это ядро ​​вместо вашей строки № 23 (нумерация здесь):

if([JSON isKindOfClass:[NSDictionary class]]) {
   NSDictionary *jsonDictionary = JSON;
   NSLog(@"%@",[jsonDictionary allKeys]);
} else { 
  NSLog(@"JSON object class: %@",[JSON class]);
}

и, пожалуйста, покажите нам выход.

Еще кое-что:

Вы получаете массив из запроса. Большой! Это действительный JSON. Так что вам нужно отладить его. Как я уже сказал, позор - это не неограниченный доступ к публичному API, так что я могу в этом разобраться. Но теперь вы должны отладить свой результат. Я вижу в вашем коде, что вы пытаетесь получить доступ к закладкам. Поэтому я заглядываю в раздел "Закладки" в документации, и это какой-то список (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];
   }
  }
}

Если бы это был я, я бы написал собственный форматировщик, чтобы перевести его в формат JSON, а затем использовал NSJSONSerialization, как только узнал, что он действителен. То, что вы опубликовали, так далеко от действительности, что это никак не сработает. Я удивлен, что они возвращают его в таком формате, предоставляют ли они какую-то библиотеку для использования своих услуг?

Если вы хотите что-то еще проще, я могу дать вам мой CGIJSONObject библиотека, которая будет обрабатывать JSON с помощью отражения - вам просто нужно отразить ключи в API вместе с вашими классами, и это хорошо.

Другие вопросы по тегам