如何在iOS中动态解析JSON

How to parse JSON dynamically in iOS

本文关键字:JSON 动态 iOS      更新时间:2023-09-26

我们使用了第三方服务,它提供了一个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在设备上的导航方式,而不需要提交新的二进制文件。

我要添加的唯一警告是要小心您在关键路径中添加了多少功能。苹果不允许下载新代码,所以无论你做什么,你都不想最终被苹果解释为脚本语言,无论限制有多严格。