AFNETWORKINGはNILに自動的に解析するようになることができますか?
-
12-12-2019 - |
質問
私たちの携帯アプリでAFNETWORKINGを使用しています。
私は次のようにしてうんざりしています。
if ([json objectForKey:@"nickname"] isKindOfClass:[NSNull class]]) {
nickname = nil;
} else {
nickname = [json objectForKey:@"nickname"];
}
.
AFNETWORKINGを自動的にオブジェクトを自動的にNILに設定するためにできることは、JSONレスポンスに値がNULLの場合は0になります。
解決
辞書には、キーのオブジェクトとしてnil
を含めることができないため、実際には可能ではありません。あなたが望む行動を得るために鍵は完全に除外されなければならないでしょう、そしてそれはそれ自身の方法で望ましくないでしょう。
あなたが受け取っていたデータを管理しなかったとし、JSONに鍵が存在したのかわからなかったとします。それらをすべてリストまたはテーブルに表示したい場合は、NULLオブジェクトのキーが辞書の外に除外された場合は、誤ったリストが表示されます。
NSNull
は、Cocoaコレクションのための「何もない」プレースホルダーです、そしてそれがこの場合に使われている理由です。
マクロで少し簡単に入力できるようにすることができます。
#define nilOrJSONObjectForKey(JSON_, KEY_) [[JSON_ objectForKey:KEY_] isKindOfClass:[NSNull class]] ? nil : [JSON_ objectForKey:KEY_]
nickname = nilOrJSONObjectForKey(json, @"nickname");
. 他のヒント
AFHTTPSessionManager ResponseシリアライザのFlag SetRemovesKeysWithNullValuesをYesに設定できます。
AFHTTPSessionManager *manager = [[AFHTTPSessionManager alloc]initWithBaseURL:url sessionConfiguration:config];
AFJSONResponseSerializer *serializer = [AFJSONResponseSerializer serializer];
[serializer setRemovesKeysWithNullValues:YES];
[manager setResponseSerializer:serializer];
. DV_の回答はAfhttpSessionManagerに最適です。ただし、マネージャの代わりにAFHTTPRequestOperationを使用している場合は、これを試してください。
AFHTTPRequestOperation *op = [[AFHTTPRequestOperation alloc] initWithRequest:request];
AFJSONResponseSerializer *serializer = [AFJSONResponseSerializer serializer];
serializer.removesKeysWithNullValues = YES;
op.responseSerializer = serializer;
. Minced https://github.com/hyperoslo/minced JSONの応答からNULLを処理するのに役立つことができるものをしてください。nullの代わりに空の文字列を置きます。
デフォルトのNSJSOnSerializationをSBJSONに置き換えると、問題が解決します。
SBJSONは、NSJSEnserializationの "null"
の選択ではなくオブジェクトをnilにします。使用できるさまざまなJSONパーサーの要件を見てください。 https://github.com/AFNETWORKING/AFNETWORKINGその他
この関数でカスタムAFNETWORKORKINGを使用できます。任意の値のデフォルトをNULL
のオブジェクトに設定します。static id AFJSONObjectByRemovingKeysWithNullValues(id JSONObject, NSJSONReadingOptions readingOptions) {
if ([JSONObject isKindOfClass:[NSArray class]]) {
NSMutableArray *mutableArray = [NSMutableArray arrayWithCapacity:[(NSArray *)JSONObject count]];
for (id value in (NSArray *)JSONObject) {
[mutableArray addObject:AFJSONObjectByRemovingKeysWithNullValues(value, readingOptions)];
}
return (readingOptions & NSJSONReadingMutableContainers) ? mutableArray : [NSArray arrayWithArray:mutableArray];
} else if ([JSONObject isKindOfClass:[NSDictionary class]]) {
NSMutableDictionary *mutableDictionary = [NSMutableDictionary dictionaryWithDictionary:JSONObject];
for (id <NSCopying> key in [(NSDictionary *)JSONObject allKeys]) {
id value = (NSDictionary *)JSONObject[key];
if (!value || [value isEqual:[NSNull null]]) {
// custom code here
//[mutableDictionary removeObjectForKey:key];
[mutableDictionary setObject:@"" forKey:key];
} else if ([value isKindOfClass:[NSArray class]] || [value isKindOfClass:[NSDictionary class]]) {
mutableDictionary[key] = AFJSONObjectByRemovingKeysWithNullValues(value, readingOptions);
}
}
return (readingOptions & NSJSONReadingMutableContainers) ? mutableDictionary : [NSDictionary dictionaryWithDictionary:mutableDictionary];
}
return JSONObject;
.
}