我正在编写一个递归方法,它基本上遍历NSManagedObject对象并将其转换为JSON字典。我已经完成了大部分工作,但我遇到的问题是,当涉及到对象的逆时,方法会进入无限循环。
例如,假设该方法以一个具有Job类的对象开始,并且在该Job对象内部有一个名为survey的属性。调查是一个包含多个JobSurvey对象的NSSet。每个JobSurvey对象都包含一个反向原始Job对象的反转,该属性称为“Job”。
当我通过我的方法运行它时,它通过进入作业并开始处理每个属性来启动无限循环。一旦方法到达survey属性,它将再次被调用以按预期处理每个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;
}