2014-03-24 121 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數據當閱讀總是仔細檢查你收到的對象的類。