Ios 如何使用NSString编写的表达式查询NSDictionary?
我希望能够运行名为Ios 如何使用NSString编写的表达式查询NSDictionary?,ios,objective-c,Ios,Objective C,我希望能够运行名为evaluateExpression:on:的假设函数,并得到“John”作为答案 NSDictionary *dict = @{"result": @[@{@"name": @"John"}, @{@"name": @"Mary"}]}; NSString *expression = @"response['result'][0]['name']"; NSString *answer = [self evaluateExpression: expression on: dic
evaluateExpression:on:
的假设函数,并得到“John”作为答案
NSDictionary *dict = @{"result": @[@{@"name": @"John"}, @{@"name": @"Mary"}]};
NSString *expression = @"response['result'][0]['name']";
NSString *answer = [self evaluateExpression: expression on: dict];
这可能吗?有一个NSObject类别,它扩展了
valueForKeyPath
以提供valueForKeyPath和索引。它让你写下:
NSDictionary *dict = @{@"result": @[@{@"name": @"John"}, @{@"name": @"Mary"}]};
NSString *path = @"result[0].name";
NSString *answer = [dict valueForKeyPathWithIndexes:path];
XCTAssertEqualStrings(answer, @"John");
该类别按psy分类,如下所示:
普通的老valueForKeyPath
会让你接近,但并不完全是你想要的。但在以下形式中可能有用:
NSDictionary *dict = @{@"result": @[@{@"name": @"John"}, @{@"name": @"Mary"}]};
NSString *path = @"result.name";
NSString *answer = [dict valueForKeyPath:path];
XCTAssertEqualObjects(answer, (@[@"John", @"Mary"]));
在花了相当长的时间试图以最有效的方式解决这个问题之后,我想到了另一个方法:使用javascript
Ewan发布的上述方法确实解决了这个问题,但我想添加一些额外的自定义特性,objective-c方法很快变得太复杂了。最后,我用javascript编写了eval
代码,并使用JavascriptCore将其集成到objective-c中。有了它,它就变得像一行eval()
调用一样简单。阅读有关键值编码的内容。我不明白为什么会被否决。如果你认为这是一件小事,出来留下一个答案,就像下面那个人回答的那样,这不是一件小事,不是我。其他人,非常感谢!正如我所猜测的,没有简单的解决方法,但是这个解决方案看起来是可行的!
NSDictionary *dict = @{@"result": @[@{@"name": @"John"}, @{@"name": @"Mary"}]};
NSString *path = @"result.name";
NSString *answer = [dict valueForKeyPath:path];
XCTAssertEqualObjects(answer, (@[@"John", @"Mary"]));