我正在使用JSON-RPC在iOS应用程序和服务器之间进行通信。服务器的某些返回值是可选的。
考虑到我正在使用的技术组合,最好是返回这些空值,如{“telephone”:null},还是完全省略响应中的“telephone”元素?
对我要问的内容的进一步解释:
它看起来不像JSON-RPC规范与方法结果有很大关系(如果我错了请纠正我)并且显然不发送负载null元素会提高性能并减少带宽。我最感兴趣的是iOS NSJSONSerialization视角下的最佳方法。是否更容易/更好地检查NSDictionary中是否存在密钥,或者现有密钥是否具有空值?
答案 0 :(得分: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
编辑:我在电子商务发布应用中使用了完全相同的代码。几十个不同的API返回了数千个对象 - 必须查看每个项目以查看它是[NSNull null]
是否是一场噩梦。我试着写一个例程来修饰结果,它会递归地查看字典和数组并重建对象,但它太复杂了。
无论如何,我从来没有遇到过这个解决方案的问题。显然是YMMV。
答案 1 :(得分:2)
首先{“telephone”:“null”}不是空值。有引号所以实际上phone属性具有字符串值,文本为“null”。服务器需要发送{“telephone”:null} - 没有引号。 我将列出您的应用程序响应所需的所有相关属性,如果没有值,则将null作为值。然后,如果key的值为NSNull,您可以轻松地检入从NSJSONSerialization获得的NSDictionary。
if ([dictionaryValue isKindOfClass:[NSNull class]])
myThink.myProperty = nil;
答案 2 :(得分:1)
如果有兴趣的话,我已将支票打包到一个功能中。
-(id)checkNull:(id)object{
if([object isKindOfClass:[NSNull class]])return nil;
else return object;
}