在 iOS 中保存 JSON 对象

Posted

技术标签:

【中文标题】在 iOS 中保存 JSON 对象【英文标题】:saving JSON object in iOS 【发布时间】:2011-04-18 18:58:32 【问题描述】:

我使用 SBJsonParser 来解析我从服务器查询的大型 json 响应。我想使用时间戳方法来知道何时我实际上必须重新获取并再次重新解析所有数据,所以我想知道如何在不需要的时候保存我的数据请求大型 JSON 包来刷新我的数据。

我想我应该使用 NSCoding 协议并大致如下存档:

// alloc nsdata obj
NSMutableData *data = [[[NSMutableData alloc] init] autorelease];

// create archiver
NSKeyedArchiver *archiver = [[[NSKeyedArchiver alloc] initForWritingWithMutableData:data] autorelease];  

// archive whiteboard
[archiver encodeObject:mSaveData forKey:@"Data"];
[archiver finishEncoding];
[data writeToFile:dataPath atomically:YES];

但是有没有一种简单的方法来编码这个 JSON 对象,它实际上是一个 NSDictionaries 的 NSArray,还是我必须仔细地编码这个对象中的每个字段?

也许有一种更简单的方法,比如将 json 对象本身保存为字符串(在使用 objectWithData 方法解析之前)并在每次应用加载并想要使用本地副本时重新解析它?

【问题讨论】:

【参考方案1】:

由于您要保存的数据只是 NSArrays、NSDictionaries 以及大概像 NSStrings 和 NSNumbers 之类的东西,我不明白为什么您需要“精心编码每个字段”。您使用 NSKeyedArchiver 执行此操作的方式是有效的,您不需要任何进一步的代码来保存。其他一些选项:

使用+[NSKeyedArchiver archiveRootObject:toFile:]。 使用 SBJSON 将数据转回 JSON 并将 JSON 字符串存储为 UTF-8 数据。 使用 +[NSPropertyListSerialization dataFromPropertyList:format:errorDescription:] 将其保存为 plist。

【讨论】:

谢谢,但我的理解是,被编码的对象必须实现 NSCoding 协议,然后基本上为每个保存的数据调用 encode___ 方法(​​在 encodeWithCoder: 方法中)。你是说我可以简单地使用 encodeObject:forKey: 方法并传入 NSArray,或者在 archiveRootObject:toFile: 方法中将 NSArray 作为根对象传递(不遍历每个字段),它只会保存所有数据即使它是字典和数组等的嵌套数组? 传递 NSArray 作为根对象,你应该很高兴。当你解码它时,你会得到这个数组作为根对象。 好的。这是因为 NSArray 对象根据需要原生实现了 nscoding 协议? 是的;任何采用NSCoding 协议的对象(从 API 参考中可以看出)都可以使用 NSKeyedEncoder 进行编码。唯一需要实现 initWithCoder:encodeWithCoder: 的情况是,如果您希望能够使用 NSKeyedEncoder 对您自己的类之一进行编码。【参考方案2】:

AsiHTTP 允许您缓存您的请求。它实现了您需要的功能

【讨论】:

以上是关于在 iOS 中保存 JSON 对象的主要内容,如果未能解决你的问题,请参考以下文章

在核心数据iOS中保存json数据

在Python 中如何将类对象序列化为JSON?

parse.com / iOS - 有没有办法以 json 格式下载整个类对象?

ios/objective-c:保存核心数据时出错

jquery在cookie中保存json数据对象

iOS:NSJSONSerialization:错误的代码或错误的 JSON 结构?