2016-08-23 89 views
-3

我在這行代碼,iOS-初始化自定義類使用JSON返回nil

Country *country = [[Country alloc] initWithNSDictionary:jsonObject]; 

我得到一個元素的JSONObject但爲什麼國家在零?

我在項目中有國家級文件,我已經通過它做了一個對象。

JSON響應:

{"geonames": [{ 
    "continent": "AS", 
    "capital": "Nuova Delhi", 
    "languages": "en-IN,hi,bn,te,mr,ta,ur,gu,kn,ml,or,pa,as,bh,sat,ks,ne,sd,kok,doi,mni,sit,sa,fr,lus,inc", 
    "geonameId": 1269750, 
    "south": 6.747139, 
    "isoAlpha3": "IND", 
    "north": 35.504223, 
    "fipsCode": "IN", 
    "population": "1173108018", 
    "east": 97.403305, 
    "isoNumeric": "356", 
    "areaInSqKm": "3287590.0", 
    "countryCode": "IN", 
    "west": 68.186691, 
    "countryName": "India", 
    "continentName": "Asia", 
    "currencyCode": "INR" 
}]} 

initWithNSDictionary方法

- (instancetype) initWithNSDictionary:(NSDictionary*)countryInfo_ 
{ 
    self = [super init]; 
    if(self) { 
     NSLog(@"Country Info = %@",countryInfo_); 
     self.code = [countryInfo_ valueForKey:@"countryCode"]; 
     self.name = [countryInfo_ valueForKey:@"countryName"]; 
     self.continent = [countryInfo_ valueForKey:@"continentName"]; 
     self.region = [countryInfo_ valueForKey:@"region"]; 
     self.currencyCode = [countryInfo_ valueForKey:@"currencyCode"]; 
     self.population = [countryInfo_ valueForKey:@"population"]; 

    } 
    NSLog(@"code %@", code); 

    return self; 
} 
+0

在問題中增加'initWithNSDictionary'方法。第二件事改變你的問題的標題。它應該與您的查詢或問題有關! – Lion

+0

更改標題。你有解決方案嗎? @KetanParmar – KAR

+2

你的'initWithNSDictionary' mehod做什麼?據說,任何人都可以給答案! – Lion

回答

0

改變的代碼行到

Country *country = [[Country alloc] initWithNSDictionary:(NSDictionary *)jsonObject]; 

和訪問變量從國家使用

[countryCode setText:[country.code description]]; 

此使用說明解決我的問題。

0

使用此上

Country *country = [[Country alloc] initWithNSDictionary:[jsonObject objectForKey:@"your key"]]; 

//[[NSDictionary alloc] initWithObjectsAndKeys: 
        //jsonObject ?: [NSNull null], @"jsonObject",nil] 
+0

這是我的JSONObject - 的JSONObject( { areaInSqKm = 「3287590.0」; 資本= 「Nuova的德里」; 大陸= AS; continentName =亞洲; COUNTRYCODE = IN; 國家名稱=印度; CURRENCYCODE = INR; 東= 「97.403305」; fipsCode = IN; geonameId = 1269750; isoAlpha3 = IND; isoNumeric = 356; 北= 「35.504223」 ; 人口= 1173108018; south =「6.747139」; west =「68.186691」; } )@SMi – KAR

+0

@KahanR請在您的問題中添加api的回覆而不是評論。 –

+0

如果要使用jsonObject的值初始化Country對象的屬性,則必須通過鍵將每個值插入到這些屬性中 – Sofeda

1

由於您沒有提供足夠的問題信息,我寫的答案假設基礎:

在您的CountryinitWithNSDictionary方法應該定義類似這樣的東西。

-(instancetype)initWithNSDictionary : (NSDictionary*)dictionary{ 

self = [super init]; 

if (self) { 

    self.firstName = [dictionary objectForKey:@"firstName"]; //This is just example because you haven't add sufficient information in question 
    self.lastName = [dictionary objectForKey:@"lastName"]; 
} 

return self; 
} 

然後,你可以爲你在你的問題已經創建創建實例或Country對象,

Country *country = [[Country alloc] initWithNSDictionary:jsonObject]; 

確保JSON對象有你在initWithNSDictionary方法中使用的關鍵和價值。我剛剛舉了名字和姓氏的例子。您應該根據您的json對象管理initWithNSDictionary中的數據。

+0

他現在已經添加了'initWithDictionary'方法,請查看 – NSNoob

+1

爲什麼使用'valueForKey:'? – Droppy

+1

他的缺點是他沒有從他的JSON(dict-> arr-> dict模型)中提取最內部的字典,這就是爲什麼他的值提取返回nil。告訴他如何得到最內在的字典,你的答案就會完成。當然,Droppy說什麼 – NSNoob

1

你的結構是:

-Dictionary 
--Array 
---Dictionary 

這意味着你有一個包含字典數組的頂部字典。

你的錯誤是,你試圖用頂級字典初始化你的對象,而頂級字典沒有提供你提到的值的鍵,所以它返回nil,你的對象依次有nil值。

簡單地說,要傳遞其僅具有下列鍵值對的字典:

Key: Geonames 
Value: An Array 

然後在您的init方法假定你是它包含了其他鍵的時候,其實那些其他鍵存在僅在數組中包含的字典中。這是下面的字典:

{ 
    "continent": "AS", 
    "capital": "Nuova Delhi", 
    "languages": "en-IN,hi,bn,te,mr,ta,ur,gu,kn,ml,or,pa,as,bh,sat,ks,ne,sd,kok,doi,mni,sit,sa,fr,lus,inc", 
    "geonameId": 1269750, 
    "south": 6.747139, 
    "isoAlpha3": "IND", 
    "north": 35.504223, 
    "fipsCode": "IN", 
    "population": "1173108018", 
    "east": 97.403305, 
    "isoNumeric": "356", 
    "areaInSqKm": "3287590.0", 
    "countryCode": "IN", 
    "west": 68.186691, 
    "countryName": "India", 
    "continentName": "Asia", 
    "currencyCode": "INR" 
} 

所以你需要從數組中獲得上述字典,並用它來初始化你的對象。

要修復它,你需要修改你的initWithDictionary方法(或者理想情況下,你調用initWithdictionary方法的方式,但現在讓我們忘記它)。

- (instancetype) initWithNSDictionary:(NSDictionary*)countryInfo_ 
{ 
    self = [super init]; 
    if(self) { 
     NSLog(@"Country Info = %@",countryInfo_); 
     NSArray *internalArray = countryInfo_[@"geonames"]; //Now you got your array of dictionaries. 
     if([internalArray count]>0){ 
      NSDictionary *internalDictionary = internalArray[0]; //Assuming there will always be only one dictionary in that array but if there are more, thats your design problem. You got your internal dictionary now 
      self.code = internalDictionary[@"countryCode"]; 
      self.name = internalDictionary[@"countryName"]; 
      self.continent = internalDictionary[@"continentName"]; 
      self.region = internalDictionary[@"region"]; 
      self.currencyCode = internalDictionary[@"currencyCode"]; 
      self.population = internalDictionary[@"population"]; 
     } 


    } 
    NSLog(@"code %@", code); 

    return self; 
} 

注:這是假設將永遠存在於你的字典數組一個字典或至少只是你想使用的第一個。這意味着你有一些信息隱瞞了我們,或者在你的設計上有一個很大的設計缺陷。

+0

爲什麼要分配'internalDictionary'而不是引用數組中現有的? – Droppy

+0

@Droppy我喜歡這種方式。它可以簡單地通過'[internalArray objectAtIndex:0]'來訪問。查看編輯歷史記錄,我剛剛寫道,但並不真的喜歡它。有點讓我覺得不安全 – NSNoob

+0

但是,是的,而不是偏執,它真的浪費一個實例,所以會恢復到 – NSNoob

相關問題