Ios 解析JSON并在本地保存
我正在开发一个用Objective-C编写的iOS应用程序,我几乎完成了,除了一件事: 我正在将JSON解析为tableview,并希望将数据本地存储在应用程序中。但我不知道最好的方法。每一行都有一个图像、一个标题、一个描述和一个链接。我有不同的标签和不同的JSON (我不想每次打开应用程序时都解析JSON,我想检查JSON中是否添加了新的内容,然后再次解析。但现在我很高兴能够将JSON中的数据保存到本地) 我已经为此挣扎了一段时间,我真的需要一些帮助。这是我在应用程序准备好进入应用程序商店之前需要修复的最后一件事 我不知道您是否需要查看任何代码,但我还是发布了它,以便您更好地了解我在做什么 解析json的代码:Ios 解析JSON并在本地保存,ios,objective-c,json,Ios,Objective C,Json,我正在开发一个用Objective-C编写的iOS应用程序,我几乎完成了,除了一件事: 我正在将JSON解析为tableview,并希望将数据本地存储在应用程序中。但我不知道最好的方法。每一行都有一个图像、一个标题、一个描述和一个链接。我有不同的标签和不同的JSON (我不想每次打开应用程序时都解析JSON,我想检查JSON中是否添加了新的内容,然后再次解析。但现在我很高兴能够将JSON中的数据保存到本地) 我已经为此挣扎了一段时间,我真的需要一些帮助。这是我在应用程序准备好进入应用程序商店之前
jsonData_ = [[NSMutableData alloc] init];
NSString *urlString = [NSString stringWithFormat:@"http://www.myUrl.se/json/%@.json", _whatState];
NSURL *url = [NSURL URLWithString: urlString];
NSURLRequest *urlReq = [NSURLRequest requestWithURL: url];
NSURLConnection *connection = [NSURLConnection connectionWithRequest: urlReq delegate:self];
-(void)connectionDidFinishLoading:(NSURLConnection*) connection{
//NSLog(@"Succeeded! Recieved %d bytes of data", [jsonData_ length]);
NSError *error;
NSArray *items = [NSJSONSerialization JSONObjectWithData: jsonData_ options: kNilOptions error: &error];
NSSortDescriptor *sortDesc = [[[NSSortDescriptor alloc] initWithKey:@"title" ascending:YES]copy];
NSMutableArray *sortedItems = [NSMutableArray arrayWithObject: sortDesc];
sortedItems = [[items sortedArrayUsingDescriptors: sortedItems] copy];
if(!error)
{
tableData_ = sortedItems;
tableImgs_ = [[NSMutableArray alloc] initWithArray: tableData_ copyItems: YES];
[self.tableView reloadData];
jsonIsFinishedLoading = TRUE;
}
else
{
NSLog(@"ERROR");
}
}
我的tableview的代码:
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *cellIdentifier = @"listItem";
TSCustomCell *cell = (TSCustomCell*) [tableView dequeueReusableCellWithIdentifier:cellIdentifier forIndexPath:indexPath];
[cell setSelectedBackgroundView:selectedCellBgColorView];
if(jsonIsFinishedLoading)
{
NSDictionary *row = [tableData_ objectAtIndex: indexPath.row];
NSString *title = [row objectForKey:@"title"];
cell.url = [row objectForKey:@"url"];
UIFont *defaultFont = [UIFont fontWithName:@"Edmondsans-Bold" size:12.0];
[cell.listItemLbl setText: title];
[cell.listItemLbl setFont:defaultFont];
if([[tableImgs_ objectAtIndex:indexPath.row] isMemberOfClass: [UIImage class]])
{
[cell.listItemImage setImage: [tableImgs_ objectAtIndex: indexPath.row]];
}
else
{
UIActivityIndicatorView *loadingSymbol = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle: UIActivityIndicatorViewStyleGray];
loadingSymbol.frame = cell.listItemImage.frame;
[cell addSubview: loadingSymbol];
[loadingSymbol startAnimating];
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0ul);
dispatch_async(queue, ^{
NSString *url = [row objectForKey: @"image"];
if([url isEqualToString: @""])
{
url = @"http://www.myUrl.se/images/standard.png";
}
else
{
url = [row objectForKey: @"image"];
}
NSURL *imgUrl = [NSURL URLWithString: url];
NSData *imageData = [NSData dataWithContentsOfURL: imgUrl];
UIImage *image = [UIImage imageWithData: imageData];
if(image != nil)
{
[tableImgs_ replaceObjectAtIndex:indexPath.row withObject:image];
NSLog(@"tableImgs != nil");
}
else
{
NSLog(@"tableImgs = nil");
[cell.listItemImage setImage: [UIImage imageNamed:@"standard_transp.png"]];
}
dispatch_sync(dispatch_get_main_queue(), ^{
[loadingSymbol removeFromSuperview];
[tableView reloadRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation: UITableViewRowAnimationNone];
});
}); //end dispatch_async
}
}
}
return cell;
}
谢谢 使用AFNetworking来实现这一点。它比NSURLConnection更简单、更快、更好
请在此处阅读更多信息:使用AFNetworking来实现此目的。它比NSURLConnection更简单、更快、更好
请阅读此处的更多信息:如果我理解您的意思是正确的,您可以通过以下代码将JSOn数据保存到用户默认值中
[[NSUserDefaults standardUserDefaults] setObject:jsonData_ forKey:@"myData"];
如果您正在解析json,那么您就有了数据
当你想得到它的时候
jsonData_ = [[NSUserDefaults standardUserDefaults] valueForKey: @"myData"];
如果我理解您的意思是正确的,那么您可以使用此代码将JSOn数据保存到用户默认值中
[[NSUserDefaults standardUserDefaults] setObject:jsonData_ forKey:@"myData"];
如果您正在解析json,那么您就有了数据
当你想得到它的时候
jsonData_ = [[NSUserDefaults standardUserDefaults] valueForKey: @"myData"];
使用和将对象保存到磁盘。如果为每一行创建一个对象,就可以保存它们
您还可以使用这种方法保存JSON本身,也可以将其存储在
使用和将对象保存到磁盘。如果为每一行创建一个对象,就可以保存它们
您还可以使用这种方法保存JSON本身,也可以将其存储在
AFNetworking能帮我解决本地存储数据的问题吗?当然可以!!。只要看一下这篇文章,网络可以帮我解决本地存储数据的问题吗?是的,当然可以!!。浏览一下这篇文章,你不想保存
项目
或分类数据项
,而不是原始数据吗?但问题是,我有不止一个json,有不同的数据。我可以在NSUserDefaults中保存多个JSON吗?可以。不同的json-UserDefaultSof中的不同键当然,谢谢Arthur!userDefault可以存储多少数据?我认为在userDefault中保存大量数据不是一个好主意。如果有很多数据,最好使用CoreData。你不想保存项
或排序数据项
,而不是原始数据吗?但问题是,我有不止一个json,具有不同的数据。我可以在NSUserDefaults中保存多个JSON吗?可以。不同的json-UserDefaultSof中的不同键当然,谢谢Arthur!userDefault可以存储多少数据?我认为在userDefault中保存大量数据不是一个好主意。如果有很多数据,最好使用CoreData。