2012-04-07 71 views
2

假設這是一個JSON的值,我想分配給一個布爾變量:如何從JSON獲取布爾值?

"retweeted": false 

這是我如何解析JSON數據:

NSError *error; 
NSArray *timeline = [NSJSONSerialization JSONObjectWithData:responseData options:NSJSONReadingMutableLeaves error:&error]; 

現在,我已經定義爲bool屬性:

BOOL *retweeted; 

我的班裏面。當我這樣做,而解析JSON:

tweet.retweeted = [[[timeline objectAtIndex:i] objectForKey:@"retweeted"] boolValue]; 

我得到這個錯誤:

enter image description here

如何解決這個問題呢?

+0

布爾值應該定義爲BOOL轉推; – NeverBe 2012-04-07 11:48:14

回答

13
BOOL *retweeted; 

這是錯誤的,布爾值是標量,而不是Objective-C對象,所以他們不需要聲明爲指針。使用

BOOL retweeted; 

改爲。

+0

謝謝。警告現在消失了。但是當我做NSLog(@「%@」,tweet.retweeted)它現在總是爲空,它應該是YES或NO。 – 2012-04-07 12:09:14

+0

@Richard Knop你用NSLog試過(@「%@」,self.retweeted?@「YES」:@「NO);? – Mat 2012-04-07 12:11:20

+0

是的,你很幸運!因爲YES =(BOOL)1和NO =(BOOL)0,但NSLog在遇到%@時查找對象,如果它爲0(= nil,null,NULL等),則輸出'(null)';如果不是null,那麼它會嘗試發送[(BOOL)1描述]並且會崩潰,你最好先學習Objective-C,然後再做一些實例性的東西。 – 2012-04-07 12:17:07

7

NSJSONSerialization串行化後,布爾值被存儲爲NSNumber。如果你看看它實際存儲的類型是__NSCFBoolean但這並不重要。 NSNumber是一個不存在的抽象類。系統將該值與具體的類一起存儲。

所以

NSNumber* boolean = [serializedDictionary valueForKey:@"boolValue"];

這個返回NOYES一個@0@1。您可以使用是作爲的booleanValue做:

if(boolean.boolValue){ 
    // ... 
} 
+0

「NSNumber是一個不存在的抽象類」 - 呵呵什麼?它**確實存在... – 2012-12-01 15:31:55

+0

我看過NSNumber是一種包裝類,它使int和double值的行爲與對象類似,它確實存在,但它如何存儲數據取決於y ou初始化它。當您查看調試器時,您可以看到不同類型,具體取決於初始化對象的方式。 – doozMen 2012-12-06 15:58:30

+0

是的,但它們都是'NSNumber'的子類。 – 2012-12-06 16:10:37

9

我做這件事的最佳方法是:

BOOL success = [[responseObject valueForKey:@"success"] boolValue]

乾淨,簡潔和內聯。

+0

迄今爲止最好的回答 – 2016-08-05 23:05:32