22

モバイルアプリでAFNetworkingを使用しており、多くの場合、一部の値がnullであるJSONが返されます。

私は次のことをするのにうんざりしています。

if ([json objectForKey:@"nickname"] isKindOfClass:[NSNull class]]) {
    nickname = nil;
} else {
    nickname = [json objectForKey:@"nickname"];
}

JSON応答で値がnullの場合、AFNetworkingがオブジェクトを自動的にnilに設定するか、数値を0に設定するためにできることはありますか?

4

6 に答える 6

31

AFHTTPSessionManager 応答シリアライザーでフラグ setRemovesKeysWithNullValues を YES に設定できます。

AFHTTPSessionManager *manager = [[AFHTTPSessionManager alloc]initWithBaseURL:url sessionConfiguration:config];
AFJSONResponseSerializer *serializer = [AFJSONResponseSerializer serializer];
[serializer setRemovesKeysWithNullValues:YES];
[manager setResponseSerializer:serializer];
于 2015-03-13T15:32:50.823 に答える
21

nilディクショナリにはキーのオブジェクトとして含めることができないため、実際には不可能です。必要な動作を得るには、キーを完全に除外する必要があり、それ自体が望ましくありません。

受け取ったデータを制御できず、JSON に存在するキーを知らなかったとします。それらをすべてリストするか、テーブルに表示したい場合、null オブジェクトのキーがディクショナリから除外されていると、正しくないリストが表示されます。

NSNullは Cocoa コレクションの「何もない」プレースホルダーであり、それがこの場合に使用される理由です。

マクロを使用すると、入力が少し簡単になります。

#define nilOrJSONObjectForKey(JSON_, KEY_) [[JSON_ objectForKey:KEY_] isKindOfClass:[NSNull class]] ? nil : [JSON_ objectForKey:KEY_]

nickname = nilOrJSONObjectForKey(json, @"nickname");
于 2012-05-22T01:05:43.780 に答える
2

DV_ の答えは AFHTTPSessionManager に最適です。ただし、マネージャーの代わりに AFHTTPRequestOperation を使用している場合は、これを試してください。

AFHTTPRequestOperation *op = [[AFHTTPRequestOperation alloc] initWithRequest:request];
AFJSONResponseSerializer *serializer = [AFJSONResponseSerializer serializer];
serializer.removesKeysWithNullValues = YES;
op.responseSerializer = serializer;
于 2015-04-10T11:12:41.307 に答える
1

デフォルトのNSJSONSerializationをSBJSONに置き換えると、問題が解決します。

SBJSONは、NSJSONSerializationが「null」を選択する代わりにオブジェクトをnilにします

使用できるさまざまなJSONパーサーの要件を確認してください。 https://github.com/AFNetworking/AFNetworking#requirements

于 2012-05-22T00:44:13.840 に答える