我将这个JSON对象加载到NSDictionary中:
media = {
photos = {
photo = (
{
"$t" = "http://some url";
"@id" = 1;
"@size" = x;
},
{
"$t" = "http://another url";
"@id" = 1;
"@size" = fpm;
},
{
);
};
};
我正在尝试搜索照片数组并仅使用@size属性= x返回照片。
我认为这会有效,但它会返回零对象:
NSObject *photo = [[photos valueForKeyPath:@"media.photos.photo"] filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"%@ == x",@"@size"]];
我尝试在' x'周围添加单引号。但那也失败了。我认为属性名称本身中的@符号会导致问题。任何帮助将不胜感激。
修改
以@开头的关键似乎是问题所在。如果我尝试使用NSPredicate搜索数组,它会抛出一个" NSUnknownKeyException ...类不符合键值"错误。
我可以使用这样的嵌套for循环进行搜索:
for (id photo in photos) { for (id key in photo) { id value = [photo objectForKey:key]; if ([key isEqualToString:@"@size"] && [value isEqualToString:@"x"]) { stringXLargePhotoUrl = [photo valueForKey:@"$t"]; break; } } if (stringXLargePhotoUrl != Nil) break; }
但这很笨重。如果可能的话,我宁愿使用NSPredicate。我无法控制JSON对象,因此我无法将密钥更改为不以@开头。
答案 0 :(得分:0)
这篇文章非常好,可以提供帮助http://nshipster.com/nspredicate/
%@是对象值的var arg替换 - 通常是字符串, 号码或日期。
%K是密钥路径的var arg替换。
更改
... [NSPredicate predicateWithFormat:@"%@ == x",@"@size"]];
到
... [NSPredicate predicateWithFormat:@"%K == x",@"@size"]];
(@
到K
)。