-1

ここで JSON を解析しており、データを正しく取得しています。ただし、情報を NSDictionary に入れて読み取ろうとすると、このエラーが発生します

'NSInvalidArgumentException', reason: '-[__NSCFArray objectForKey:]: unrecognized selector sent to instance 0x1cda3d50'

コードはこちら

    if (data != nil) {

    NSDictionary *res = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableLeaves error:&error];

    NSDictionary *dic = [[res objectForKey:@"data"] objectForKey:@"current_condition"];
    self.location = [[dic objectForKey:@"request"]objectForKey:@"query"];
}

ここで何がうまくいかないのか考えていますか?ありがとう。

編集

これは、NSDictionary *res をログに記録したときに得られるものです

 data =     {
    "current_condition" =         (
                    {
            cloudcover = 100;
            humidity = 86;
            "observation_time" = "11:11 PM";
            precipMM = "2.2";
            pressure = 1019;
            "temp_C" = 1;
            "temp_F" = 34;
            visibility = 8;
            weatherCode = 296;
            weatherDesc =                 (
                                    {
                    value = "Light rain";
                }
            );
            weatherIconUrl =                 (
                                    {
                    value = "http://www.worldweatheronline.com/images/wsymbols01_png_64/wsymbol_0033_cloudy_with_light_rain_night.png";
                }
            );
            winddir16Point = SSW;
            winddirDegree = 210;
            windspeedKmph = 15;
            windspeedMiles = 9;
        }
    );
    request =         (
                    {
            query = "North Massapequa, United States Of America";
            type = City;
        }
    );
}
4

3 に答える 3

1

ログの出力を誤解しているのは、NSDictionary私が長年のバグであると信じていることに助けられています。

出力は次のようになります。

data =     {
    "current_condition" =         (
                    {
            cloudcover = 100;

これにより、データの実際の形状が隠されます。data、current_condition、weatherDesc などの行の = の後の長い切れ目が見えますか? そこに改行があるはずなので、出力は次のようになります。

data =
{
    "current_condition" = 
    (
        {
            cloudcover = 100;

() は配列を示します。(はい、 [] は他の場所で使用されていますが。この出力は古くて無愛想です。Apple が突然重要だと判断したとしても、コードを壊さずに修正できるとは思えません。)

これは、データの真の形状を示しています:current_conditionは配列です。ディクショナリは、配列自体ではなく、配列内の最初 (インデックス 0) のオブジェクトです。

データ全体では、これは次のようになります。

data =
{
    "current_condition" = 
    (
        {
            cloudcover = 100;
            humidity = 86;
            "observation_time" = "11:11 PM";
            precipMM = "2.2";
            pressure = 1019;
            "temp_C" = 1;
            "temp_F" = 34;
            visibility = 8;
            weatherCode = 296;
            weatherDesc =
            (
                {
                    value = "Light rain";
                }
            );
            weatherIconUrl =
            (
                {
                    value = "http://www.worldweatheronline.com/images/wsymbols01_png_64/wsymbol_0033_cloudy_with_light_rain_night.png";
                }
            );
            winddir16Point = SSW;
            winddirDegree = 210;
            windspeedKmph = 15;
            windspeedMiles = 9;
        }
    );
}

余分なレベルの間接化に合わせてコードを適切に調整すれば、問題ないはずです。

于 2013-01-28T23:43:57.453 に答える
1

JSON オブジェクトには、おそらく、辞書が必要な場所 (objectForKey:配列オブジェクトに送信した) のどこかに配列が含まれています。

JSON をどこかにダンプしてみて、期待する形式であることを確認してください。

EDIT:ダンプからわかるようにres[@"request"]、配列です( があります())。したがって、配列を呼び出しobjectForKey:@"query"requestクラッシュしています。

self.location = [[[res objectForKey:@"request"] objectAtIndex:0] objectForKey:@"query"];代わりに試してください。

于 2013-01-28T23:10:20.420 に答える
0

-[__NSCFArray objectForKey:]: unrecognized selectorobjectForKey:-ここで、明らかに、配列を呼び出そうとしていることがわかります。

ここ:

self.location = [[dic objectForKey:@"request"]objectForKey:@"query"];

dicは配列です:

data =     {
    "current_condition" =         ( // <--- array

おそらくあなたがやりたかった:

self.location = [[res objectForKey:@"request"]objectForKey:@"query"]; // res, not dic

request配列でもありますが、まったく同じエラーが発生します...

于 2013-01-28T23:19:45.780 に答える