iOS - конвертируйте IFNULL(...) ключ JSON в атрибут объекта

Я работаю с Pocket API и получение пользовательских статей. Я использую JSONModel библиотека, которую я нашел на GitHub делать Article объекты, использующие атрибуты, которые я получаю из ответа JSON. каждый Article объект имеет wordCount атрибут, который раньше легко назначался из части ответа Pocket API:

"word_count" = 947;

Но теперь, по какой-то причине, Pocket изменил способ подсчета слов, и теперь он дает следующее:

"IFNULL(e.word_count, 0)" = 947;

Это разбило мое приложение, потому что мой JSONModel Библиотека ожидала, что каждая статья будет иметь атрибут word_count, чтобы она могла превратиться в Article объект с wordCount приписывать. Как это исправить?

Вот мой код для Article.h настройка объекта:

#import "JSONModel.h"

@class Article;

@interface Article : JSONModel

@property (strong, nonatomic) NSString<Optional> *newsSource;
@property (nonatomic, strong) NSString *givenUrl;
@property (strong, nonatomic) NSString *resolvedUrl;
@property (nonatomic, strong) NSString *resolvedTitle;
@property (nonatomic, strong) NSString *excerpt;
@property (strong, nonatomic) NSDictionary<Optional> *image;
@property (nonatomic, strong) NSNumber *wordCount;
@property (strong, nonatomic) NSString<Optional> *fullText;
@property (strong, nonatomic) NSString<Optional> *summary;
@property (strong, nonatomic) NSString *itemId;
@property (strong, nonatomic) NSNumber *favorite;
@property (strong, nonatomic) NSNumber *hasImage;
@property (strong, nonatomic) NSNumber *status;
@property (strong, nonatomic) NSDictionary<Optional> *authors;
@property (strong, nonatomic) NSNumber *sortId;

+(void)retrieveArticlesWithState:(NSString*)state andFavorite:(NSString *)favorite andOffset:(NSNumber*)offsetInteger successCallback:(void (^)(NSArray*))success errorCallback:(void (^)(NSString*))error;

Этот код выше позволяет JSONModel знать, какие атрибуты ожидать от ответа JSON и превращать в атрибуты для каждого Article объект.

В моем Article.m файл, я реализую метод со следующим:

+(void)retrieveArticlesWithState:(NSString*)state andFavorite:(NSString *)favorite andOffset:(NSNumber*)offsetInteger successCallback:(void (^)(NSArray*))success errorCallback:(void (^)(NSString*))error
{
    [self letPocketRetrieveArticlesWithState:state andFavorite:favorite andOffset:offsetInteger successCallback:[Article modelListCallback:success] errorCallback:error];
}

Этот метод помогает мне конвертировать атрибуты, такие как word_count в wordCount:

#pragma mark - helpers

//Built in option for JSONModel to turn things like sort_id into sortId
+(JSONKeyMapper*)keyMapper
{
    return [JSONKeyMapper mapperFromUnderscoreCaseToCamelCase];
}

Этот код помогает мне последовательно конвертировать в несколько Article объекты для возврата списка:

/*!
 * @brief Helper method to get the same block to consistently turn API response into article models.
 * @param callback A block to call once the article has been parsed from the API response.
 * @return A block to be passed along to API requests for parsing out API responses consistently.
 */
+(void(^)(NSDictionary*))modelListCallback:(void (^)(NSArray*))callback {
    return ^(NSDictionary* json){
        NSError* err = nil;
        NSMutableArray* articles = [[NSMutableArray alloc] init];
        for(NSDictionary* article in [[json objectForKey:@"list"] allValues]) {
            [articles addObject:[[Article alloc] initWithDictionary:article error:&err]];
        }
        callback(articles);
    };
}

Это часть примера ответа JSON, который я получаю:

{
    complete = 1;
    error = "<null>";
    list =     {
        1027166096 =         {
            "IFNULL(e.word_count, 0)" = 2930;
            authors =             {
                37936109 =                 {
                    "author_id" = 37936109;
                    "item_id" = 1027166096;
                    name = "Telegraph Reporters";
                    url = "http://www.telegraph.co.uk/authors/telegraph-reporters/";
                };
            };
            excerpt = "In his third year at Oxford, as an undergraduate studying biology and physiology, Oliver Sacks was not yet 20 years old when he first decided to take LSD.";
            favorite = 0;
            "given_title" = "Oliver Sacks' most mind-bending experiment";
...
...
...

1 ответ

Решение

Это похоже на ошибку с их стороны... "IFNULL(e.word_count, 0)" - это код SQL, который не должен появляться в качестве ключа в ответе JSON. Если у вас есть способ сообщить об этой ошибке им

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