4

目前我正在使用以下方法来验证数据是否为 ​​Null。

if ([[response objectForKey:@"field"] class] != [NSNull class])
    NSString *temp = [response objectForKey:@"field"];
else
    NSString *temp = @"";

当响应字典包含数百个属性(和相应的值)时,问题就来了。我需要将这种条件添加到字典的每个元素中。

还有其他方法可以完成吗?

对 Web 服务进行任何更改的任何建议(除了不将空值插入数据库)?

任何想法,任何人?

4

4 回答 4

7

我所做的是在 NSDictionary 上放置一个类别

@interface NSDictionary (CategoryName)

/**
 * Returns the object for the given key, if it is in the dictionary, else nil.
 * This is useful when using SBJSON, as that will return [NSNull null] if the value was 'null' in the parsed JSON.
 * @param The key to use
 * @return The object or, if the object was not set in the dictionary or was NSNull, nil
 */
- (id)objectOrNilForKey:(id)aKey;



@end


@implementation NSDictionary (CategoryName)

- (id)objectOrNilForKey:(id)aKey {
    id object = [self objectForKey:aKey];
    return [object isEqual:[NSNull null]] ? nil : object;
}

@end

然后你可以使用

[response objectOrNilForKey:@"field"];

如果您愿意,可以修改它以返回一个空白字符串。

于 2012-04-17T05:48:51.263 回答
0

首先是一个小问题:你的测试不是惯用的,你应该使用

if (![[response objectForKey:@"field"] isEqual: [NSNull null]])

如果您希望字典中所有值为 的[NSNull null]键都重置为空字符串,最简单的修复方法是

for (id key in [response allKeysForObject: [NSNull null]])
{
    [response setObject: @"" forKey: key];
}

以上假设response是一个可变字典。

但是,我认为您确实需要审查您的设计。如果数据库中不允许使用值,则根本不应该允许[NSNull null]它们。

于 2012-04-10T09:34:26.790 回答
0

我不太清楚你需要什么,但是:

如果您需要检查 key 的值是否不为 NULL,您可以这样做:

for(NSString* key in dict) {
   if( ![dict valueForKey: key] ) {
       [dict setValue: @"" forKey: key];
   }
}

如果您有一些必需的键,您可以创建静态数组,然后执行以下操作:

static NSArray* req_keys = [[NSArray alloc] initWithObjects: @"k1", @"k2", @"k3", @"k4", nil];

然后在您检查数据的方法中:

NSMutableSet* s = [NSMutableSet setWithArray: req_keys];

NSSet* s2 = [NSSet setWithArray: [d allKeys]];

[s minusSet: s2];
if( s.count ) {
    NSString* err_str = @"Error. These fields are empty: ";
    for(NSString* field in s) {
        err_str = [err_str stringByAppendingFormat: @"%@ ", field];
    }
    NSLog(@"%@", err_str);
}
于 2012-04-10T09:35:42.950 回答
0
static inline NSDictionary* DictionaryRemovingNulls(NSDictionary *aDictionary) {

  NSMutableDictionary *returnValue = [[NSMutableDictionary alloc] initWithDictionary:aDictionary];
  for (id key in [aDictionary allKeysForObject: [NSNull null]]) {
    [returnValue setObject: @"" forKey: key];
  }
  return returnValue;
}


response = DictionaryRemovingNulls(response);
于 2014-12-30T12:57:03.797 回答