我正在编写一个递归方法,它基本上遍历一个 NSManagedObject 对象并将其转换为 JSON 字典。我已经完成了大部分工作,但是我遇到了一个问题,当涉及到对象的逆时,该方法进入无限循环。
例如,假设该方法从一个具有 Job 类的对象开始,并且在该 Job 对象内部有一个名为surveys 的属性。调查是一个包含多个 JobSurvey 对象的 NSSet。每个 JobSurvey 对象都包含一个与原始 Job 对象相反的内容,该属性称为“Job”。
当我通过我的方法运行它时,它通过进入作业开始无限循环并开始处理每个属性。一旦该方法到达调查属性,它将再次被调用以按预期处理每个 JobSurvey 对象。然后该方法处理每个属性,直到它到达 Job(反向)对象。那时它将继续处理该对象,从而创建无限循环。
关于如何解决这个问题的任何想法?我正在尝试编写此方法,而不必使用对象映射创建自定义对象类,因为它需要能够与我传递给它的任何类型的对象一起使用。下面是我到目前为止的代码。
- (NSDictionary *)encodeObjectsForJSON:(id)object
{
NSMutableDictionary *returnDictionary = [[NSMutableDictionary alloc] init];
// get the property list for the object
NSDictionary *props = [VS_PropertyUtilities classPropsFor:[object class]];
for (NSString *key in props) {
// get the value for the property from the object
id value = [object valueForKey:key];
// if the value is just null, then set a NSNull object
if (!value) {
NSNull *nullObj = [[NSNull alloc] init];
[returnDictionary setObject:nullObj forKey:key];
// if the value is an array or set, then iterate through the array or set and call this method again to encode it's values
} else if ([value isKindOfClass:[NSArray class]] || [value isKindOfClass:[NSSet class]]) {
NSMutableArray *retDicts = [[NSMutableArray alloc] init];
// encode each member of the array to a JSON dictionary
for (id val in value) {
[retDicts addObject:[self encodeObjectsForJSON:val]];
}
// add to the return dictionary
[returnDictionary setObject:retDicts forKey:key];
// else if this is a foundation object, then set it to the dictionary
} else if ([value isKindOfClass:[NSString class]] || [value isKindOfClass:[NSNumber class]] || [value isKindOfClass:[NSNull class]] || [value isKindOfClass:[NSDate class]]) {
[returnDictionary setObject:value forKey:key];
// else this must be a custom object, so call this method again with the value to try and encode it
} else {
NSDictionary *retDict = [self encodeObjectsForJSON:value ];
[returnDictionary setObject:retDict forKey:key];
}
}
return returnDictionary;
}