7

我正在尝试将我的 coredata 转换为 json,我一直在努力让它工作,但找到了一种几乎可以工作的方法。

我的代码:

NSArray *keys = [[[self.form entity] attributesByName] allKeys];
        NSDictionary *dict = [self.form dictionaryWithValuesForKeys:keys];
        NSLog(@"dict::%@",dict);

        NSError *error;
        NSData *jsonData = [NSJSONSerialization dataWithJSONObject:dict
                                                           options:NSJSONWritingPrettyPrinted // Pass 0 if you don't care about the readability of the generated string
                                                             error:&error];

        if (! jsonData) {
            NSLog(@"Got an error: %@", error);
        } else {
            NSString *jsonString = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];
            NSLog(@"json::%@",jsonString);
        }

“形式”也是:

 @property (strong, retain) NSManagedObject *form;

这很好用,除了我在一些 coredata 属性中保存了 NSIndexSet 。这给 JSON 写入带来了问题。现在,我的索引集不需要转换为 json,所以我想知道是否有办法从字典中删除所有索引?或者也许有更好的方法来做到这一点,我不知道。

这是dict的nslog的一部分:

...
    whereExtent = "";
    wiring =     (
    );
    wiring1 = "<NSIndexSet: 0x82b0600>(no indexes)";
    wiringUpdated = "<null>";
    yardFenceTrees = "<null>";
}

所以在这种情况下,我想从 dict 中删除“wiring1”,但需要能够以“动态”方式进行(不使用名称“wiring1”来删除它)

4

3 回答 3

20

为了能够删除值,您的字典必须是NSMutableDictionary类的实例。

对于动态删除值,从 dict 中获取所有键,测试每个键的对象并删除不必要的对象:

NSArray *keys = [dict allKeys];
for (int i = 0 ; i < [keys count]; i++)
 {
   if ([dict[keys[i]] isKindOfClass:[NSIndexSet class]])
   {
     [dict removeObjectForKey:keys[i]];
   }
}

注意:删除值不适用于快速枚举。作为另一种快速破解方法,您可以创建一个没有不必要对象的新字典。

于 2013-11-05T16:10:10.620 回答
8

使用 NSMutableDictionary 代替 NSDictionary。您的代码将如下所示:

NSMutableDictionary *dict = [[self.form dictionaryWithValuesForKeys:keys] mutableCopy]; //create dict
[dict removeObjectForKey:@"wiring1"]; //remove object

不要忘记使用 mutableCopy。

于 2013-11-05T15:47:45.893 回答
1

此示例代码将通过NSDictionary并构建一个NSMutableDictionary仅包含 JSON 安全属性的新代码。

目前它不能递归地工作,例如,如果您的字典包含字典或数组,它将删除它而不是通过字典本身并修复它,但这很容易添加。

// Note: does not work recursively, e.g. if the dictionary contains an array or dictionary it will be dropped.
NSArray *allowableClasses = @[[NSString class], [NSNumber class], [NSDate class], [NSNull class]];
NSDictionary *properties = @{@"a":@"hello",@"B":[[NSIndexSet alloc] init]};
NSMutableDictionary *safeProperties = [[NSMutableDictionary alloc] init];

[properties enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop){
    BOOL allowable = NO;
    for (Class allowableClass in allowableClasses)          {
        if ([obj isKindOfClass:allowableClass])
        {
            allowable = YES;
            break;
        }
    }       
    if (allowable)
    {
        safeProperties[key] = obj;
    }
}];
NSLog(@"unsafe: %@, safe: %@",properties,safeProperties);
于 2013-11-05T16:23:37.627 回答