10

JSON サービスからデータを取得したい。JSON 値からデータを取得すると、iOS 7 バージョンのみがクラッシュします。その下の JSON サービスから返されます。

{
    voteAverageRating = 0;
    voteCount = 0;
}

私のコード

int voteCount = [listDic objectForKey:@"voteCount"] intValue] ;

_LB_voteNumber.text = [NSString stringWithFormat:@"(%i)",voteCount];

iOS 5、5.1、6.0、6.1 で動作しますが、iOS7 バージョンのみがクラッシュします。このエラーが発生しました:

0x00098117 _mh_execute_header [NSNull intValue]: 認識されないセレクターがインスタンスに送信されました

次に、その下のコードを変更しました。

NSString *voteCount = [listDic objectForKey:@"voteCount"] ;

_LB_voteNumber.text = [NSString stringWithFormat:@"(%@)",voteCount];

このコードを実行すると。iOS 7版のみ再度クラッシュしました。このエラーが発生しました:

0x00098117 _mh_execute_header [NSNull 長さ]: 認識されないセレクターがインスタンスに送信されました

どうすればこの問題を解決できますか?

4

4 に答える 4

41

JSON からの値にアクセスする前にチェックを入れます。

if([NSNull null] != [listDic objectForKey:@"voteCount"]) {
    NSString *voteCount = [listDic objectForKey:@"voteCount"];
    /// .... 
}

チェックする理由は、のようなコレクション オブジェクトではNSDictionary値を許可しないためnil、null として格納されるためです。intValueこのセレクターを認識しないため、 aに渡すNSNullことはできません。

それが役立つことを願っています!

于 2013-09-19T06:41:47.297 に答える
6

他の人が言ったように、JSON null はに逆シリアル化されNSNullます。とは異なりnil、 に (ほとんどの) メッセージを送信することはできませんNSNull

1 つの解決策は、カテゴリを介して NSNull に -intValue の実装を追加することです。

@implementation NSNull (IntValue)
-(int)intValue { return 0 ; }
@end

に送信-intValueするNSNullと返されるため、コードが機能するようになりました0

別のオプション:「IfNullThenNil」カテゴリを NSObject に追加することもできます...

@implementation NSObject (IfNullThenNil)
-(id)ifNullThenNil { return self ; }
@end

@implementation NSNull (IfNullThenNil)
-(id)ifNullThenNil { return nil ; }
@end

これで、コードは次のようになります。

int voteCount = [[[listDic objectForKey:@"voteCount"] ifNullThenNil] intValue] ;

-ifNullThenNilJSON オブジェクトから値にアクセスする場所に呼び出しを追加するだけです。

于 2014-02-24T08:36:25.270 に答える
1

私にとってこれはうまくいきました

NSArray* merStore = [tmpDictn objectForKey:@"merchantStore"];

if ([merStore isKindOfClass:[NSArray class]] && merStore.count !=0)
{
    for(int n = 0; n < merStore.count; n++)
    {
        NSMutableDictionary *storeDic = [merStore objectAtIndex:n];


        [latitudeArray addObject:[storeDic objectForKey:@"latitude"]];

    }
}

それが誰かに役立つことを願っています。何か助けが必要な場合はお知らせください。

于 2015-06-30T13:18:31.137 に答える