如何在iOS中动态解析JSON
How to parse JSON dynamically in iOS
我们使用了第三方服务,它提供了一个JS文件。js文件启动一个http请求并获得一个json。我们解析了json并得到了我们想要的内容,但是json格式总是改变。
是否有一种方法来解析json但不更新我们的应用程序?
不断更改模式听起来很愚蠢,但无论如何,也许您可以尝试在云中的某个地方有一个清单,将最新的模式关键字转换为您的应用程序可以理解的关键字?
基本上,我假设JSON中的信息是相似的(否则就没有意义了),只有关键字改变了。你可以有一个不断更新的JSON,将应用中使用的关键字转换为webservice使用的最新关键字。
所以一个例子看起来像这样。想象一下,这就是你在开发应用程序时所使用的格式(这是应用程序所期望的)。
{
"name" : "Henri",
"title" : "iOS Developer"
}
现在,如果webservice改变了它的schema并返回如下内容
{
"key1" : "Henri",
"key2" : "iOS Developer"
}
你应该有清单。Json,翻译成这样
{
"name" : "key1",
"title" : "key2"
}
我希望你明白我的意思,基本上你可以把翻译转移到云端,让你有机会在应用保持不变的情况下保持最新。加载完翻译后你可以像这样访问数据
NSString *name = [actualJSON objectForKey: [manifestJSON objectForKey: @"name"]];
JSON主页有相当多关于这个主题的材料,如果您愿意,应该允许您开发自己的解析器。在页面底部也有一些objective - c解析器可用。
http://www.json.org/为此,我们研究了Cocoa的标准键路径基础设施,但对它与数组和字典的组合方式不是特别满意。最后,我编写了自己的键路径查找工具,就像这样:
- (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'的任何值。
产品代码实际上有一些更智能的导航辅助,允许你说诸如"取字典数组中键'size'值最大的对象"或"如果存在则取type=large的对象,否则取任何对象"之类的话,但你想在那里做什么取决于你的应用程序和模式的可变性。
一旦你通过键路径导航对象图,你就可以从服务器的某个地方抓取当前的键路径,允许你改变JSON在设备上的导航方式,而不需要提交新的二进制文件。
我要添加的唯一警告是要小心您在关键路径中添加了多少功能。苹果不允许下载新代码,所以无论你做什么,你都不想最终被苹果解释为脚本语言,无论限制有多严格。
- 从 json 动态获取数据时出现类型错误
- 如何使用javascript Json动态添加到html表中
- 通过json动态绑定作用域到ng模型
- JSON动态Javascript解析”;未定义”;
- json动态菜单和路由
- 从 json 动态构建 dom 树
- 如何在 Angular JS 中使用 JSON 动态选择单选按钮
- 使用嵌套的JSON动态填充选择选项
- Mootools Request.JSON动态回调
- 通过json动态发送到服务器的表单数据不起作用
- 如何:在谷歌地图上从JSON动态更新标记
- 使用Backbone.Marionette从JSON动态生成站点导航
- 从JSON动态创建对象
- 当按钮按下或设置为true时,从JSON动态创建表单
- 用json动态加载树
- 如何从JSON动态生成HTML中嵌套的复选框列表?
- 当使用JSON动态填充一些字段时,我如何保持一些表单字段完整
- 从JSON动态定义ReactJS路由
- 从Google图表中的JSON动态填充数据
- 填充JSON动态数组