如何在iOS中dynamicparsingJSON

我们使用了第三方服务,它提供了一个JS文件。 js文件启动一个http请求并得到一个json。我们parsing了json并得到了我们想要的内容,但json格式总是改变。

有没有办法parsingJSON,但不更新我们的应用程序?

这听起来很糟糕,不断地改变模式,但无论如何,也许你可以尝试在云中的某个地方有一个清单,将最新的模式关键字翻译成你的应用程序能够理解的关键字?

基本上,我认为在JSON中的信息是相似的(否则根本没有意义),只有关键字改变。 您可以不断更新JSON,将应用程序中使用的关键字转换为Web服务使用的最新的关键字。

所以一个例子看起来像这样。 想象一下,这是开发应用程序时习惯的格式(这是一个应用程序所期望的)。

{ "name" : "Henri", "title" : "iOS Developer" } 

现在如果web服务改变它的模式并返回这样的东西

 { "key1" : "Henri", "key2" : "iOS Developer" } 

你应该有一个manifest.json这样翻译它

 { "name" : "key1", "title" : "key2" } 

我希望你能通过这种方式得到我要去的地方,基本上你可以把翻译转移到云端,让你有机会保持最新,而应用程序保持不变。 所以在加载翻译后,你可以像这样访问数据

 NSString *name = [actualJSON objectForKey: [manifestJSON objectForKey: @"name"]]; 

JSON主页上有相当多的关于这个主题的资料,如果你愿意的话可以让你开发自己的parsing器。 在页面底部还有一些ObjectiveCparsing器可用。

http://www.json.org/

为此,我们研究了Cocoa的标准关键path基础设施,但是对于如何与数组和字典结合起来并不是特别满意。 最后,我最终写了自己的小键盘查找的东西,基本上是这样的:

 - (id)objectAtPath:(NSString *)path inObject:(id)object { // accept an input string like key1.key2.key3.index.key4.etc; // so we'll split on the dots and use each separate component // to navigate the object graph NSString *components = [path componentsSeparatedByString:@"."]; for(NSString *component in components) { if([object isKindOfClass:[NSDictionary class]]) { // if this is a dictionary, use this component as // a key into the dictionary object = [object objectForKey:component]; } else if([object isKindOfClass:[NSArray class]]) { // if this is an array, use this component // as an index into the array NSInteger index = [component integerValue]; // treat out of bounds indices as finding nil // rather than raising an exception if(index < 0 || index >= [object count]) object = nil; else object = [object objectAtIndex:index]; } } } 

所以你可能会调用objectAtPath:@"shoes.4.typeOfLaces" inObject:jsonResult如果'jsonResult'是一个字典来获取数组'shoes',数组中的索引4的字典,然后字典的任何值'typeOfLaces'。

生产代码实际上有一些更聪明的导航辅助工具,可以让你说“像这个字典数组中的任何一个对象具有最大的键值”或者“如果它存在,采取任何对象“,但究竟你想做什么取决于你的应用程序和模式的可变性。

一旦按关键path导航对象图,您可以从某处的服务器获取当前的关键path,从而允许您更改在设备上导航JSON的方式,而无需提交新的二进制文件。

我要添加的唯一的警告是要小心多lessfunction,你把你的关键path。 苹果公司不允许下载新的代码,所以无论你做什么,你都不希望被苹果公司认为是一种脚本语言,无论它受到多大的限制。