2014-01-31 60 views
0

在objectivec中有沒有一種方法可以從json字典獲得精確值類型從json字典獲取正確的類型值

例如,考慮這個JSON:

{ 
    "ret": 0, 
    "state": "Italy", 
    "lat": 45.46347, 
    "lon": 9.19404 
} 

我想INT值 「RET」,爲 「狀態NSString價值,併爲FLOAT值 「LAT」 和「lon」。

我用這個片段:

NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:@"sampleJson.json"]]; 
NSDictionary *dict = [ NSJSONSerialization JSONObjectWithData:data options:0 error:nil ]; 

id val = [ dict valueForKeyPath:@"lat" ][0]; 

NSLog(@"%@", [val class]); 

但顯然,輸出的是一個通用NSNumber

2014-01-31 11:13:51.903 Test0002 [2044:70B] __NSCFNumber

這是可能得到的float代替NSNumber,自動?

+0

嘗試ID VAL = [字典valueForKey:[NSNumber的numberWithInt:@ 「LAT」]]; –

+0

@OptimusPrime什麼?你有沒有讀過這個問題? – elp

+0

int ret = [[dict valueForKey:@「ret」] intValue]; –

回答

1

要檢查的NSNumber爲float或者int,你可以用這個方法:

if ([val isMemberOfClass:[NSNumber class]]) 
    { 
     switch(CFNumberGetType((CFNumberRef((NSNumber)val)) 
     { 
      /* List of results: 
      kCFNumberSInt8Type 
     kCFNumberSInt16Type 
     kCFNumberSInt32Type 
     kCFNumberSInt64Type 
     kCFNumberFloat32Type 
     kCFNumberFloat64Type 
     kCFNumberCharType 
     etc... */ 
     } 
    } 

一旦你找到的類型,只需使用:

float f = [((NSNumber)val) floatValue]; 

int i =[((NSNumber)val) intValue]; 

在此處查找完整列表:

CFNumber Ref

要檢查它是否是一個的NSString,只是做:

if([val isMemberOfClass:[NSString class]]) 
{ 
}