簡體   English   中英

如何在iOS中動態解析JSON

[英]How to parse JSON dynamically in iOS

我們使用了第三方服務,它提供了一個JS文件。 js文件啟動一個http請求並獲取一個json。我們解析了json並得到了我們想要的內容,但是json格式總是在變化。

有沒有辦法解析json但不更新我們的應用程序?

不斷更改架構聽起來很愚蠢,但是無論如何,也許您可​​以嘗試在雲中某處找到清單,將最新的架構關鍵字轉換為您的應用可以理解的清單?

基本上,我認為JSON中的信息是相似的(否則根本就沒有意義),只有關鍵字會發生變化。 您可能會擁有不斷更新的JSON,它將應用程序中使用的關鍵字轉換為Web服務使用的最新關鍵字。

因此,示例如下所示。 想象一下,這是開發應用程序時慣用的格式(這是一個應用程序期望的格式)。

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

現在,如果Web服務更改了它的架構並返回了類似的內容

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

您應該有一個manifest.json像這樣翻譯它

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

我希望您能按此方向進行操作,基本上,您可以將翻譯轉移到雲中,讓您有機會在應用保持不變的情況下保持最新。 因此,在加載翻譯后,您可以像這樣訪問數據

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

JSON主頁上有很多關於該主題的資料,如果您願意,應該可以讓您開發自己的解析器。 頁面底部還有一些ObjectiveC解析器。

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];
             }
    }
}

因此,如果“ jsonResult”是用於獲取數組“ shoes”的字典,該數組中索引4的字典以及該字典對該鍵具有的任何值,則可以在objectAtPath:@"shoes.4.typeOfLaces" inObject:jsonResult調用objectAtPath:@"shoes.4.typeOfLaces" inObject:jsonResult 'typeOfLaces'。

生產代碼實際上具有一些更智能的導航輔助,使您可以說出諸如“獲取此字典數組中具有鍵'size'的最大值的任何對象”之類的東西,或者“如果存在則使用type = large的對象,否則,接受任何對象”,但是您要在該對象中執行的操作完全取決於您的應用和架構的可變性。

通過鍵路徑導航對象圖后,您只需從某處的服務器獲取當前鍵路徑,即可更改JSON在設備上的導航方式,而無需提交新的二進制文件。

我要添加的唯一警告是要小心您在關鍵路徑中添加了多少功能。 Apple不允許下載新鮮的代碼,因此無論您受到什么限制,無論您做什么,Apple都不會以Apple可以將其解釋為腳本語言的任何方式結束。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM