2017-10-25 8 views
3

を読むしようとすると、私はこのコードをJSON形式があります。Objective Cの__ NSSingleObjectArrayIとはどういう意味ですか?私はJSON

{ 
    "weather": [{ 
     "description": "clear sky", 
     "icon": "01n" 
    }], 
    "base": "stations", 
    "main": { 
     "temp": 285.514 
    }, 
    "clouds": { 
     "all": 0 
    }, 
    "dt": 1485792967, 
    "id": 1907296 
} 

をそして私は、アイコンの文字列(01N)

をretriveそして、このコードを使用する:

@property(nonatomic,strong) NSString *cityImageName; 

self.cityImageName = [[dataJson valueForKey:@"weather"] valueForKey:@"icon"]; 

そして、後で変数プリントを確認するとき:

<__NSSingleObjectArrayI 0x604000009890>(
01n 
) 

最後に、文字列を直接取得する方法はありますか?はあなたがキー値コーディングトラップに巻き込まれた__NSSingleObjectArrayI

+0

なぜ、「objectForKey:」の代わりに「valueForKey:」を使用していますか? – rmaddy

+0

2つの答えが正しいが、質問に答えるために何がうまくいかなかったかを説明する( 'valueForKey:')。内部クラスは "NSArray" "Immutable"(最後の "I"はMutable NSArray "対" NSMutableArray ")、1つのオブジェクト(" SingleObject "部分)しか持たないように最適化されています。 – Larme

答えて

3

が好きではありません。

valueForKeyは特別な動作をします。配列に適用されると、常にの配列を返します。指定されたキーの値はすべてです。

KVCを使用する場合を除き、valueForKeyを使用しないでください。推奨される構文は、objectForKeyまたは - 好ましい - キーサブスクリプションおよび配列インデックスサブスクリプションの場合です。

この場合、キーweatherの配列の最初の項目のキーiconの値を取得する必要があります。

self.cityImageName = dataJson[@"weather"][0][@"icon"]; 

配列が空でない場合、私は

NSArray *weather = dataJson[@"weather"]; 
if (weather && weather.count > 0) { 
    self.cityImageName = weather[0][@"icon"]; 
} 
+0

これは素晴らしい答えです。今私はこのような状況でどのように作業できるのか理解しています。 – Fabio

2

__NSSingleObjectArrayI範囲外の例外を回避するためのチェックを追加しますしかしNSArrayclass clusterの実装の1つです。それが配列であることを知る以外に、この質問には本当に重要ではありません。

"weather": [{ 
    "description": "clear sky", 
    "icon": "01n" 
}], 

注:あなたが作業しているJSONはその中の1つの辞書を持つ配列が含まれているため、文字列の代わりに

あなたは(一つの要素の)配列を取得している理由は次のとおりです。中かっこを囲む角括弧。

あなたが戻って取得[dataJson valueForKey:@"weather"]呼び出すときに、JSONのこの部分を表すオブジェクト:

[ { "description": "clear sky", "icon": "01n" } ] 

この場合には2つのキーと1 NSDictionaryを含むNSArrayとしてデコードされています。

あなたがvalueForKey: on that arrayそれを呼び出す

配列の各オブジェクトにkeyを使用してvalueForKey:を起動した結果を含む配列を返します。すなわち

[dataJson valueForKey:@"weather"]一の辞書の配列であるので、[[dataJson valueForKey:@"weather"] valueForKey:@"icon"]は、その辞書に"icon"キーの値のみの配列です。

作業するJSONにこの形式が指定されている場合は、配列からfirstObjectを取得して、最初の文字列(配列が空の場合はnil)を取得できます。

関連する問題