我将 JSONKit 解析的结果存储在键/值数据库 (LevelDB) 中,但是我正在下载的 JSON 的某些字段设置为 null,这不会让您序列化相应的生成对象(NSArray 或 NSDictionary) , 将其存储为对象。
¿ 知道如何深入迭代 NSSomething(字典或数组)来更改这些值吗?
我将 JSONKit 解析的结果存储在键/值数据库 (LevelDB) 中,但是我正在下载的 JSON 的某些字段设置为 null,这不会让您序列化相应的生成对象(NSArray 或 NSDictionary) , 将其存储为对象。
¿ 知道如何深入迭代 NSSomething(字典或数组)来更改这些值吗?
有一篇文章https://github.com/johnezang/JSONKit/issues/25解释了如何修改框架以从字典和数组中省略它
有时我碰巧将一个空值设置为既不是 NSNull 也不是 NSString 的东西。因此,在我用 NSJSONSerialization 解析它之前,我已经替换了 json 字符串中的所有空字符串。我已经将数据读入 NSData 对象,将其复制到 NSString 对象中,替换空字符串并将其再次复制到 NSData 对象中,因为 NSJSONSerialization 需要一个 NSData 对象。也许你可以把它写得更短,但它确实有效。
这是代码
NSString *jsonPath = [myPath stringByAppendingPathComponent:@"myDataFile.json"];
NSMutableData *myJSON = [[NSMutableData alloc] initWithContentsOfFile:jsonPath];
NSString *jsonString = [[NSString alloc] initWithBytes:myJSON.bytes length:myJSON.length encoding:NSUTF8StringEncoding];
jsonString = [jsonString stringByReplacingOccurrencesOfString:@"null" withString:@"\"placeholder\""];
NSData * jsonData = [jsonString dataUsingEncoding:NSUTF8StringEncoding];
NSMutableDictionary *json = [NSJSONSerialization JSONObjectWithData:jsonData options:NSJSONReadingMutableContainers error:&jsonParsingError];
之后,所有先前的空值都将包含一个占位符字符串。
我将 JSON 解析为 mutableObject [[JSONDecoder decoder] mutableObjectWithUTF8String:(const unsigned char *) [json UTF8String] length:[json lengthOfBytesUsingEncoding:NSUTF8StringEncoding] error:nil ];
,然后使用此代码修复它:
-(id) fixObject: (id) a
{
if([a isKindOfClass:[NSMutableDictionary class]])
{
NSMutableDictionary *ad = a;
for (NSObject *key in ad)
{
if([[ad objectForKey:key] isKindOfClass:[NSMutableDictionary class]] || [[ad objectForKey:key] isKindOfClass:[NSMutableArray class]])
[self fixObject:[ad objectForKey:key]];
else
{
if((NSNull *)[ad objectForKey:key] == [NSNull null]) [ad setObject:@"" forKey:key];
}
}
}else if([a isKindOfClass:[NSMutableArray class]])
{
NSMutableArray *ar = a;
for (NSObject *ob in ar)
{
if([ob isKindOfClass:[NSMutableDictionary class]] || [ob isKindOfClass:[NSMutableArray class]])
{
[self fixObject:ob];
}
else if((NSNull *)ob == [NSNull null])
{
[ar removeObject:ob];
}
}
}
return a;
}
如果您找到更好的方法来做到这一点,请告诉我!