是否有可能通过解析一个SBJson4 NSInputStream?(Is it possible t

2019-10-30 04:18发布

我想包含由NSString的类型和NSMutableArrays的联络信息对象的读取JSON文件。 目前,我使用的NSData读取整个文件,然后通过它解析。 我已经使用了Stig的例子这里提到: SBJson4Parser例

   SBJson4ValueBlock block = ^(id obj, BOOL *stop) {
   NSLog(@"Found: %@", @([obj isKindOfClass:[NSDictionary class]]));
    //contactsData *contact = obj;
    NSDictionary *contact = obj;
    NSLog(@"Contact: %@",contact);
   /* NSString *fName, *lName;
    fName = [contact objectForKey:@"mFirstName"];
     lName = [contact objectForKey:@"mLastName"];
    NSLog(@"First Name: %@",fName);
    NSLog(@"Last Name: %@",lName);
    */
};

SBJson4ErrorBlock eh = ^(NSError* err){
    NSLog(@"Oops: %@",error);
};
NSLog(@"Parse work");
id parser = [SBJson4Parser multiRootParserWithBlock:block
                                       errorHandler:eh];
//uint8_t buf[1024];
//unsigned int len = 0;
NSLog(@"Trying to push stream to data");
//[inputStream read:buf maxLength:len];
NSData *data = [NSData dataWithContentsOfFile:filePath options:NSUTF8StringEncoding error:NULL];
//id data = [json da:NSUTF8StringEncoding];
SBJson4ParserStatus status = [parser parse:data];

NSLog(@"Status: %u",status);

这些天,人们似乎有数百甚至数千的联系人,这要归功于社交网络。 这将导致在iOS设备上更大的内存占用? 如果是这样,我怎么解析来自流中的单个对象? 如果非要用一个代表,一个例子将不胜感激。

请注意,我是新来的iOS开发的世界以及Objective-C的。

The structure of the json file in question:
{
  "mAddresses": [
  ],
  "mContactPhoto": "",
  "mDisplayName": ",tarun,,,,israni,,", 
  "mPhoneNumberList": [
    {
      "mLabel": "_$!<Home>!$_",
      "mNumber": "(988) 034-5678",
      "mType": 1
    }
  ]
}{
  "mAddresses": [
  ],
  "mContactPhoto": "",
  "mDisplayName": ",Sumit,,,,Kumar,,",
  "mPhoneNumberList": [
    {
      "mLabel": "_$!<Home>!$_",
      "mNumber": "(789) 034-5123",
      "mType": 1
    }
  ]
}

Answer 1:

您的解决方案看起来像它应该工作给我。 如果你的文件这么大,你不想持有它全部在内存中,即要避免这一行:

NSData *data = [NSData dataWithContentsOfFile:filePath options:NSUTF8StringEncoding error:NULL];

那么你可以使用一个NSInputStream(未经测试,但希望你得到的要点):

id parser = [SBJson4Parser multiRootParserWithBlock:block
                                       errorHandler:eh];

id is = [NSInputStream inputStreamWithFileAtPath:filePath];
[is open];

// buffer to read from the input stream
uint8_t buf[1024];

// read from input stream until empty, or an error;
// better error handling is left as an exercise for the reader
while (0 > [is read:buffer maxLength: sizeof buffer]) {
    SBJson4ParserStatus status = [parser parse:data];
    NSLog(@"Status: %u",status);
    // handle parser errors here
}
[is close];

但是,你仍然需要阅读和分析整个文件,以保证你找到一个特定的联系人。 有没有办法读只是一个特定的联系人这样。 如果这是你经常做的事情,你可能需要存储联系人支持该方案更好的方式不同。 一种方法是使用如SQLLite。



文章来源: Is it possible to parse an NSInputStream using SBJson4?