2013-12-20 99 views
1

我有,其內容是這樣的一個配置文件:解析一個配置文件

main = { 
delay = 10000; 
inputs = (
    { 
     enabled = true; 
     ip = "127.0.0.1"; 
     port = 10001; 
     file = "c:\abc.txt"; 
    }, 
    { 
     enabled = true; 
     ip = "127.0.0.1"; 
     port = 10002; 
     file = "c:\myfile.txt"; 
    }, 
); 
} 

現在,我要分析此文件,例如,獲得第二個輸入的端口號(即, 10002在這個例子中)等。

你知道目標C中最簡單的方法是什麼嗎?

謝謝!

+0

轉換JSON - > JSONKit或NSJSONSerialization – BLUEPIXY

+0

看起來像NSDictionary'的NSLog輸出(或'description'),它不適合作爲配置文件格式,因爲它不能可靠地解析回來(比較http://對於類似的問題,stackoverflow.com/questions/16783635/nsarray-to-description-and-vice-versa)。 - 如果可能,請選擇其他配置文件格式(例如JSON)。 –

回答

0

看起來像你的配置內容被NSLog輸出,從而導致無效JSON因此假設您的實際配置文件是一個有效的JSON對象,下面的代碼應該得到你所需要的:

//Don't forget to replace "configfile" with your config file name in the project 
NSString *configPath = [[NSBundle mainBundle] pathForResource:@"configfile" ofType:nil]; 
NSData *data = [[NSFileManager defaultManager] contentsAtPath:configPath]; 
NSDictionary *config = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:nil]; 
NSArray *ports = [config valueForKeyPath:@"main.inputs.port"]; 

//ports[0] is 10001 
//ports[1] is 10002 

在這裏,您可以驗證您的JSON是否有效:http://jsonlint.com。這是你的有效的JSON CONFI看起來應該像:

{ 
    "main": { 
     "delay": "10000", 
     "inputs": [ 
      { 
       "enabled": true, 
       "ip": "127.0.0.1", 
       "port": 10001, 
       "file": "c: \\abc.txt" 
      }, 
      { 
       "enabled": true, 
       "ip": "127.0.0.1", 
       "port": 10002, 
       "file": "c: \\myfile.txt" 
      } 
     ] 
    } 
} 

編輯:

我會親自使用一個模型框架,而不是隻是一個JSON解析器救你從一噸體力勞動的是帶有內置-in NSJSONSerialization class。這裏有幾個還不錯的國家:

1)GitHub上地幔 - https://github.com/MantleFramework/Mantle 我用它在以往任何時候我可以。它寫得非常好,並且考慮了框架,但是涉及到一點學習曲線,這可能對任何新的軟件都是真實的。

2)SBJson - https://github.com/stig/json-framework 可以使用SBJson如果你只想把工作做好,就已經很受歡迎,尤其是前地幔和其他框架變得可用。

我希望它有幫助。

+0

謝謝,但你知道任何免費和簡單的目標C的JSON解析器嗎? –

+0

@BlueSky:「NSJSONSerialization」作爲Foundation框架的一部分是「內置的」。 –

+0

@MartinR:謝謝,我使用gcc。我應該使用哪個頭文件以便我可以使用NSJSONSerialization? –

0

如果您能夠將配置文件格式更改或修改爲jsonplist,您可以簡單地使用內置閱讀器解析器。

否則,有第三方的方法,如libconfig

另外this question可能會有所幫助。

1

確保它是一個有效的JSON文件,然後在打開它後從文件的NSData創建一個NSJSONSerialization對象。

NSJSONSerialization *config = [[NSJSONSerialization JSONObjectWithData:DATAFROMFILE options:NSJSONReadingMutableContainers error:nil]; 

然後進入第二個輸入端口:

config[@"inputs"][1][@"port"] 

但要做到這將是從每個輸入創建的模型,因此,你可以訪問屬性強類型的屬性,而不是最好的辦法按鍵。

ie. config.port instead of configInput[@"port"]