2011-11-18 52 views
1

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

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

+0

你是说JSON数据的第三方供应商一直在改变他们的模式吗?因为解决这个问题的唯一方法是相应地重建和更新您的应用程序。尽管如此,我无法想象什么样的服务能够即时改变架构。 –

回答

1

这听起来很可怕愚蠢的不断变化的模式,但不管怎么说,也许你可以尝试在翻译了最新架构的关键字到一个你的应用程序了解云的地方有一个清单?

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

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

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

现在,如果web服务改变了它的架构,并返回这样的事情

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

你应该有它转换像这样

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

一个manifest.json的我希望你能在那里我要这样做,基本上,您可以将翻译转换为云端,让您有机会在应用程序保持不变的情况下保持最新状态。所以在翻译样之后,您可以访问数据这样

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

+1这很聪明。我同意,不断改变架构听起来非常复杂 - 尽管我想我缺少架构改变的背景。 – Dubron

0

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

http://www.json.org/

+0

我们可以解析json文件,但json的**格式**总是变化!这就是要点。 – iMom0

0

为此,我们看着可可的标准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”是一本字典,以获取数组“鞋”,字典索引4在数组中,然后无论字典对键'typeOfLaces'具有什么值。

生产代码实际上有一些更智能的导航辅助工具,可以让你说“像这个字典数组中的任何一个对象具有最大的键值大小”或“使用type = large if它存在,否则就取任何对象“,但是你想要做什么取决于你的应用和模式的可变性。

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

我要添加的唯一警告就是要小心您将多少功能放入关键路径。苹果公司不允许下载新代码,因此无论你做什么,你都不希望最终成为苹果公司可以构建为脚本语言的任何东西,无论它受到多大限制。