从NSDictionary检索JSON值

时间:2014-03-24 16:18:56

标签: ios objective-c json

我在使用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。

提前感谢您的帮助。

5 个答案:

答案 0 :(得分:2)

您需要测试返回的课程

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

答案 1 :(得分:1)

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

答案 2 :(得分:1)

在解析float之前,只检查amtStr是否为字符串:

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

答案 3 :(得分:1)

不要认为amount总是一个字符串。检查对象amount,看看它是NSDictionary还是字符串

NSDictionary * balance = [account objectForKey@"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
    }
} 

答案 4 :(得分:1)

作为一般规则:当从已接收或读取的编码JSON访问数据时,请务必仔细检查您收到的对象类。