2

I am using JSON-RPC to communicate between iOS application and the server. Some return values of the server are optional.

Considering the combination of technologies I am using, is it better to return these null values like {"telephone": null} or by completely omitting the "telephone" element in the response?

Futher explanation of what I am asking:

It doesn't look like the JSON-RPC spec specifies much to do with the method result (please correct me if I'm wrong) and clearly not sending loads null elements would improve performance and reduce bandwidth somewhat. What I'm most interested in though is the best approach from an iOS NSJSONSerialization perspective. Is it easier/better to check for whether a key exists in an NSDictionary or whether an existing key has a null value?

4

3 に答える 3

11

私のコードは巨大なデータセットを扱っており、各値でNSNullのテストを行う必要がないため、まったく異なる手法を使用していますが、確かにやや非正統的です。私が行ったのはサブクラスNSNullだったので、データを処理するときに、数値が0かどうか、文字列の長さが0かどうかなどをテストできます。

@implementation NSNull (JSON)

- (NSUInteger)length { return 0; }

- (NSInteger)integerValue { return 0; };

- (CGFloat)floatValue { return 0; };

- (NSString *)description { return @"0(null)"; } // so I know it was NSNull in log messages

- (NSArray *)componentsSeparatedByString:(NSString *)separator { return @[]; }

- (id)objectForKey:(id)key { return nil; }

- (BOOL)boolValue { return NO; }

@end

編集:私はeコマース配送アプリでこれとまったく同じコードを使用しました。文字通り何千ものオブジェクトが数十の異なるAPIによって返されていました。各アイテムを調べて、それが[NSNull null]悪夢であったかどうかを確認する必要がありました。結果をグルーミングするルーチンを作成しようとしました。辞書と配列を再帰的に調べてオブジェクトを再構築しますが、複雑になりすぎました。

いずれにせよ、私は一度もこの解決策に問題があったことはありません。明らかにYMMV。

于 2012-08-20T12:11:18.213 に答える
2

まず {"telephone": "null"} は null 値ではありません。引用符があるため、実際には電話プロパティにはテキスト「null」の文字列値があります。サーバーは {"telephone": null} を送信する必要があります - 引用符なし。アプリが応答で必要とするすべての関連プロパティをリストし、値がない場合は値として null を入れます。次に、キーの値が NSNull の場合、NSJSONSerialization から取得した NSDictionary を簡単にチェックインできます。

if ([dictionaryValue isKindOfClass:[NSNull class]])
    myThink.myProperty = nil;
于 2012-08-20T09:28:43.803 に答える