解析配置文件

时间:2013-12-20 17:10:17

标签: objective-c parsing

我有一个配置文件,其内容是这样的:

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中最简单的方法是什么?

谢谢!

3 个答案:

答案 0 :(得分:1)

确保它是一个有效的JSON文件,然后在打开后从文件的NSData创建一个NSJSONSerialization对象。

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

然后访问第二个输入端口:

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

但是,最好的方法是从每个输入创建一个模型,这样您就可以将属性作为强类型属性而不是按键访问。

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

答案 1 :(得分:0)

如果您能够将配置文件格式更改或修改为jsonplist,则可以使用内置阅读器和解析器。

另外,还有第三方方法,如libconfig

this question也可以提供帮助。

答案 2 :(得分: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配置应该是这样的:

{
    "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解析器来帮助您避免内置NSJSONSerialization类附带的大量手动工作。这里有几个非常好的:

1) GitHub Mantle - https://github.com/MantleFramework/Mantle 我尽我所能使用它。它编写得非常好,并且考虑过框架,但涉及到一些学习曲线,这可能适用于任何新的软件。

2) SBJson - https://github.com/stig/json-framework 你可以使用SBJson如果你想完成工作,它已经非常受欢迎,特别是在Mantle和其他框架可用之前。

我希望它有所帮助。