2014-03-24 116 views
0

我有一个使用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.

在此先感谢您的帮助。

+0

首先,我会试图弄清楚为什么你得到那个扭曲的JSON - 这是不正常的。特别是,“无”的关键名称强烈暗示某些事情已经被解决 - 可能是一些僵尸存储。 (你应该至少在反序列化之前检查原始的JSON,并且可能再次检查另一端。)但是如果你确定它是正确的,你应该像其他人一样使用'isKindOfClass'。 –

+0

是的,好点。在反序列化之前,我确实检查了数据,这就是它遇到的情况。所以我使用了下面推荐的建议并使其工作。谢谢大家的回复。 – user1657861

+0

我强烈建议你在另一端询问其他人 - 它看起来确实像是有些混乱。 –

回答

1

只是检查是否amtStr是一个字符串或没有,解析浮动之前:

id amtStr = [[account objectForKey:@"Balance"] valueForKey:@"amount"]); 
if([amtStr isKindOfClass:[NSString class]]){ 
    String *formattedAmt = [NSString stringWithFormat:@"$%.2f", [amtStr floatValue]]; 
} 
1

在第二种情况下,amtStrNSDictionary(尽管被声明为NSString),所以[amt isKindOfClass:[NSDictionary class]]将返回true,并[amt isKindOfClass:[NSString class]]将返回false。

1

不要以为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 
    } 
} 
2

您需要测试的类返回

id amt = [[account objectForKey:@"Balance"] valueForKey:@"amount"]); 
if ([amt isKindOfClass:[NSString class]] 
{ 
    NSString *amtStr = (NSString *)amt; 
    NSString *formattedAmt = [NSString stringWithFormat:@"$%.2f", [amtStr floatValue]]; 
    //... 
} 
+0

'id'已经是一个指向对象指针的指针;)所以你的第一行是错误的;) – HAS

+1

@HAS哦,这很尴尬!我纠正了它。谢谢! – Merlevede

1

作为一般规则:访问已接收或编码的JSON数据当阅读总是仔细检查你收到的对象的类。