我有一个配置文件,其内容是这样的:
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 :(得分: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)
答案 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和其他框架可用之前。
我希望它有所帮助。