[英]Is it possible to parse an NSInputStream using SBJson4?
我正在尝试读取包含由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
}
]
}
您的解决方案似乎应该对我有用。 如果您的文件太大而又不想将其全部保存在内存中,即您想避免以下行:
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。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.