Javascript 如何在iOS中动态解析JSON

Javascript 如何在iOS中动态解析JSON,javascript,objective-c,ios,json,api,Javascript,Objective C,Ios,Json,Api,我们使用了第三方服务,它提供了一个JS文件。 js文件启动一个http请求并获得一个json。我们解析了json并获得了我们想要的内容,但是json格式总是变化的 有没有办法解析json但不更新我们的应用程序?json主页上有很多关于这个主题的资料,如果您愿意,可以开发自己的解析器。在页面底部还有一些ObjectiveC解析器 JSON主页上有很多关于这个主题的资料,如果您愿意,可以使用这些资料开发自己的解析器。在页面底部还有一些ObjectiveC解析器 不断更改模式听起来非常愚蠢,但无论如何

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


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

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


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


不断更改模式听起来非常愚蠢,但无论如何,也许你可以尝试在云中的某个地方使用清单,将最新的模式关键字转换为你的应用程序能够理解的关键字

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

所以一个例子是这样的。假设这是开发应用程序时使用的格式(这是应用程序所期望的格式)

现在,如果Web服务更改了它的模式,并返回如下内容

{
    "key1" : "Henri",
    "key2" : "iOS Developer"
}
{
    "name" : "key1",
    "title" : "key2"
}
NSString *name = [actualJSON objectForKey: [manifestJSON objectForKey: @"name"]];
您应该有一个manifest.json,它可以这样翻译它

{
    "key1" : "Henri",
    "key2" : "iOS Developer"
}
{
    "name" : "key1",
    "title" : "key2"
}
NSString *name = [actualJSON objectForKey: [manifestJSON objectForKey: @"name"]];
我希望你明白我的意思,基本上你可以将翻译工作转移到云上,让你有机会在应用程序保持不变的情况下保持最新。因此,在加载翻译后,您可以像这样访问数据

{
    "key1" : "Henri",
    "key2" : "iOS Developer"
}
{
    "name" : "key1",
    "title" : "key2"
}
NSString *name = [actualJSON objectForKey: [manifestJSON objectForKey: @"name"]];

不断更改模式听起来非常愚蠢,但无论如何,也许你可以尝试在云中的某个地方使用清单,将最新的模式关键字转换为你的应用程序能够理解的关键字

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

所以一个例子是这样的。假设这是开发应用程序时使用的格式(这是应用程序所期望的格式)

现在,如果Web服务更改了它的模式,并返回如下内容

{
    "key1" : "Henri",
    "key2" : "iOS Developer"
}
{
    "name" : "key1",
    "title" : "key2"
}
NSString *name = [actualJSON objectForKey: [manifestJSON objectForKey: @"name"]];
您应该有一个manifest.json,它可以这样翻译它

{
    "key1" : "Henri",
    "key2" : "iOS Developer"
}
{
    "name" : "key1",
    "title" : "key2"
}
NSString *name = [actualJSON objectForKey: [manifestJSON objectForKey: @"name"]];
我希望你明白我的意思,基本上你可以将翻译工作转移到云上,让你有机会在应用程序保持不变的情况下保持最新。因此,在加载翻译后,您可以像这样访问数据

{
    "key1" : "Henri",
    "key2" : "iOS Developer"
}
{
    "name" : "key1",
    "title" : "key2"
}
NSString *name = [actualJSON objectForKey: [manifestJSON objectForKey: @"name"]];

为此,我们查看了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];
             }
    }
}
-(id)objectAtPath:(NSString*)路径inObject:(id)对象
{
//接受输入字符串,如key1.key2.key3.index.key4.etc;
//因此,我们将在点上分割,并使用每个单独的组件
//导航对象图的步骤
NSString*components=[path componentsSeparatedByString:@.”;
用于(NSString*组件中的组件)
{
if([object iskindof类:[NSDictionary类]])
{
//如果这是一本词典,请将此组件用作
//字典的钥匙
object=[objectobjectforkey:component];
}
其他的
if([object iskindof类:[NSArray类]])
{
//如果这是一个数组,请使用此组件
//作为数组的索引
NSInteger指数=[分量积分值];
//将越界指数视为寻找零
//而不是提出一个例外
如果(索引<0 | |索引>=[对象计数])对象=nil;
else object=[objectobjectatindex:index];
}
}
}
因此,您可以在object:jsonResult中调用
objectAtPath:@“shoes.4.typeOfLaces”
如果“jsonResult”是一个字典来获取数组“shoes”、数组中索引4处的字典以及该字典对键“typeOfLaces”具有的任何值

生产代码实际上有一些更智能的导航辅助工具,允许您说“获取此字典数组中键“size”值最大的对象”或“获取type=large的对象(如果存在),否则获取任何对象”,但是你到底想做什么取决于你的应用程序和模式的可变性

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


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

为此,我们查看了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];
             }
    }
}
-(id)objectAtPath:(NSString*)路径inObject:(id)对象
{
//接受输入字符串,如key1.key2.key3.index.key4.etc;
//因此,我们将在点上分割,并使用每个单独的组件
//导航对象图的步骤
NSString*components=[path componentsSeparatedByString:@.”;
用于(NSString*组件中的组件)
{
if([object iskindof类:[NSDictionary类]])
{
//如果这是一本词典,请将此组件用作
//进入t的钥匙