2

我正在使用 JSON-RPC 在 iOS 应用程序和服务器之间进行通信。服务器的一些返回值是可选的。

考虑到我正在使用的技术组合,返回这些 null 值(如 {"telephone": null} 还是完全省略响应中的 "telephone" 元素)更好?

进一步解释我的要求:

它看起来不像 JSON-RPC 规范指定与方法结果有很大关系(如果我错了,请纠正我)并且显然不发送负载 null 元素会提高性能并在一定程度上减少带宽。不过,我最感兴趣的是从 iOS NSJSONSerialization 角度来看的最佳方法。检查 NSDictionary 中是否存在键或现有键是否具有空值是否更容易/更好?

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

编辑:我在电子商务运输应用程序中使用了完全相同的代码。数十个不同的 API 返回数以千计的对象 - 必须查看每个项目以查看它[NSNull null]是否是一场噩梦。我试图编写一个例程来修饰结果,它会递归地查看字典和数组并重建对象,但它太复杂了。

无论如何,我从来没有遇到过这个解决方案的问题。显然是YMMV。

于 2012-08-20T12:11:18.213 回答
2

首先 {"telephone": "null"} 不是空值。有引号,所以实际上电话属性具有带有文本“null”的字符串值。服务器需要发送 {"telephone": null} - 不带引号。我会列出您的应用程序响应所需的所有相关属性,如果没有值,则将 null 作为值。然后,如果键的值为 NSNull,您可以轻松地检查从 NSJSONSerialization 获得的 NSDictionary。

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

如果有人感兴趣,我已经将检查打包在一个函数中。

-(id)checkNull:(id)object{
    if([object isKindOfClass:[NSNull class]])return nil;
    else return object;
}
于 2013-04-03T09:49:18.343 回答