由JSONKit(或类似)生成的对象内的NSNull值

时间:2012-08-01 16:43:58

标签: ios serialization jsonkit

我将JSONKit解析的结果存储在键/值数据库(LevelDB)中,但我正在下载的JSON将某些字段设置为null,这不会让您序列化相应的生成对象(NSArray)或NSDictionary),将其存储为对象。

¿任何想法如何深入迭代NSSomething(字典或数组)来改变这些值?

3 个答案:

答案 0 :(得分:1)

有一篇帖子https://github.com/johnezang/JSONKit/issues/25解释了如何修改框架以从字典和数组中省略它

答案 1 :(得分:1)

有时我碰巧将空值设置为既未被识别为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];

之后所有先前的空出现都将包含一个占位符字符串。

答案 2 :(得分:0)

我将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;
}

如果您找到更好的方法,请告诉我们!