如何在iOS中动态解析JSON

时间:2011-11-18 14:11:15

标签: javascript objective-c ios json api

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

有没有办法解析json但不更新我们的应用程序?

3 个答案:

答案 0 :(得分:1)

不断更改模式听起来很糟糕,但无论如何,也许您可​​以尝试在云中的某个地方使用清单将最新的模式关键字转换为您的应用理解的模式?

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

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

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

现在,如果webservice更改了它的架构并返回类似这样的内容

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

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

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

我希望你能得到我的目标,基本上你可以将翻译转移到云端,让你有机会在应用程序保持不变的同时保持最新状态。因此,在翻译中加载后,您可以访问这样的数据

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

答案 1 :(得分:0)

JSON主页上有很多关于这个主题的材料,如果你愿意,你可以开发自己的解析器。页面底部还有一些ObjectiveC解析器可用。

http://www.json.org/

答案 2 :(得分:0)

为此,我们查看了Cocoa的标准key 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'键的任何值。< / p>

生产代码实际上有一些更智能的导航辅助工具,允许你说“取这个字典数组中的任何一个对象具有最大值的密钥'大小'”或“带有类型=大的对象,如果它存在,否则采取任何对象“,但你想要做的确切取决于你的应用程序和架构的可变性。

按键路径导航对象图后,您只需从服务器某处获取当前的密钥路径,就可以更改JSON在设备上的导航方式,而无需提交新的二进制文件。

我要添加的唯一警告是要小心你在关键路径中添加了多少功能。 Apple不允许下载新的代码,所以无论你做什么,你都不希望最终得到Apple可以解释为脚本语言的任何东西,无论有多严格限制。