iOS-将IFNULL(…)JSON键转换为对象属性

iOS-将IFNULL(…)JSON键转换为对象属性,ios,json,jsonmodel,pocket,Ios,Json,Jsonmodel,Pocket,我正在使用PocketAPI获取用户文章。我使用在GitHub上找到的JSONModel库,使用从JSON响应中获得的属性创建Article对象。每个文章对象都有一个字数属性,该属性过去很容易从Pocket的API响应中分配: "word_count" = 947; 但是现在,出于某种原因,Pocket改变了它给出单词计数的方式,现在它给出了以下内容: "IFNULL(e.word_count, 0)" = 947; +(void)retrieveArticlesWithState:(NSS

我正在使用
Pocket
API获取用户文章。我使用在
GitHub
上找到的
JSONModel
库,使用从JSON响应中获得的属性创建
Article
对象。每个
文章
对象都有一个
字数
属性,该属性过去很容易从Pocket的API响应中分配:

"word_count" = 947;
但是现在,出于某种原因,Pocket改变了它给出单词计数的方式,现在它给出了以下内容:

"IFNULL(e.word_count, 0)" = 947;
+(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];
}
这使我的应用程序崩溃,因为我的
JSONModel
库希望每篇文章都有一个word\u count属性,这样它就可以使文章成为一个具有
wordCount
属性的
article
对象。我该如何解决这个问题

以下是我的
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;
此方法帮助我将
word\u count
等属性转换为
wordCount

#pragma mark - helpers

//Built in option for JSONModel to turn things like sort_id into sortId
+(JSONKeyMapper*)keyMapper
{
    return [JSONKeyMapper mapperFromUnderscoreCaseToCamelCase];
}
此代码帮助我一致地转换为多个
文章
对象以返回列表:

/*!
 * @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;
错误=”;
列表={
1027166096 =         {
“IFNULL(即单词计数,0)”=2930;
作者={
37936109 =                 {
“作者id”=37936109;
“项目标识”=1027166096;
name=“电报记者”;
url=”http://www.telegraph.co.uk/authors/telegraph-reporters/";
};
};
摘录=“奥利弗·萨克斯(Oliver Sacks)在牛津大学学习生物学和生理学的第三年,他第一次决定服用LSD时还不到20岁。”;
收藏夹=0;
“given_title”=“奥利弗·萨克斯最令人费解的实验”;
...
...
...

这看起来像是他们这边的一个bug……”IFNULL(例如word\u count,0)是一个不应在JSON响应中显示为键的SQL代码。如果你有办法,你应该向他们报告此错误

你能重新表述问题所在吗?你能包含使模型崩溃的JSON吗?当然,一秒钟。@MarinTodorov我已经用我正在使用的代码和我正在使用的JSON响应示例更新了我的帖子我得到了。JSON响应的字数部分过去只是“word\u count”=某物,但现在出于某种原因它是“IFNULL(e.word\u count,0)”。这会使我的应用程序崩溃,因为JSONModel一直给我“缺少的关键字:wordCount”错误在于它无法将其转换为属性对象,因为它现在以不同的方式返回。我认为你是对的。我只是再次尝试,它开始给我正确的“字数”属性,而不是使我的应用程序崩溃的属性。我将向Pocket API团队报告这一情况,以防这可能是一个随机问题。但现在,我只需将
字数
属性标记为
可选
,以防将来再次发生这种随机情况。谢谢!