从NSDictionary中检索JSON值
问题描述:
我有一个使用JSON填充的NSDictionary的问题。 JSON数据看起来像这样和我能够得到的金额从NSDictionary中检索JSON值
Balance = {
amount = "33069.42";
currencyCode = USD;
};
NSString *amtStr = [[account objectForKey:@"Balance"] valueForKey:@"amount"]);
NSString *formattedAmt = [NSString stringWithFormat:@"$%.2f", [amtStr floatValue]];
但是,在某些情况下,对数量没有价值,而是量有另一个的NSDictionary作为下面的示例中
Balance = {
amount = {
nil = 1;
};
currencyCode = {
nil = true;
};
};
当我尝试做stringWithFormat
NSString *formattedAmt = [NSString stringWithFormat:@"$%.2f", [amtStr floatValue]];
抛出
-[__NSCFDictionary floatValue]: unrecognized selector sent to instance 0x8a551e0
关于如何在第二种情况下获得金额值的任何想法?如果金额为零,我需要将amtStr设置为0.
在此先感谢您的帮助。
答
只是检查是否amtStr
是一个字符串或没有,解析浮动之前:
id amtStr = [[account objectForKey:@"Balance"] valueForKey:@"amount"]);
if([amtStr isKindOfClass:[NSString class]]){
String *formattedAmt = [NSString stringWithFormat:@"$%.2f", [amtStr floatValue]];
}
答
在第二种情况下,amtStr
是NSDictionary
(尽管被声明为NSString
),所以[amt isKindOfClass:[NSDictionary class]]
将返回true,并[amt isKindOfClass:[NSString class]]
将返回false。
答
不要以为amount
总是将是一个字符串。检查对象amount
,看看它是否是一个NSDictionary
或字符串
NSDictionary * balance = [account [email protected]"Balance"];
id amountObject = [balance objectForKey:@"amount"];
if (amountObject != nil({
if ([amountObject isKindOfClass:([NSDictionary class])]) {
// amount is a dictionary
} else if ([amountObject isKindOfClass:([NSString class])]) {
// amount is a number
}
}
答
您需要测试的类返回
id amt = [[account objectForKey:@"Balance"] valueForKey:@"amount"]);
if ([amt isKindOfClass:[NSString class]]
{
NSString *amtStr = (NSString *)amt;
NSString *formattedAmt = [NSString stringWithFormat:@"$%.2f", [amtStr floatValue]];
//...
}
答
作为一般规则:访问已接收或编码的JSON数据当阅读总是仔细检查你收到的对象的类。
首先,我会试图弄清楚为什么你得到那个扭曲的JSON - 这是不正常的。特别是,“无”的关键名称强烈暗示某些事情已经被解决 - 可能是一些僵尸存储。 (你应该至少在反序列化之前检查原始的JSON,并且可能再次检查另一端。)但是如果你确定它是正确的,你应该像其他人一样使用'isKindOfClass'。 –
是的,好点。在反序列化之前,我确实检查了数据,这就是它遇到的情况。所以我使用了下面推荐的建议并使其工作。谢谢大家的回复。 – user1657861
我强烈建议你在另一端询问其他人 - 它看起来确实像是有些混乱。 –