1

次のコードを書きましたが、nil を取得し続けます。これのさまざまなバリエーションを試しましたが、非常にうまくいきません。

これは私がサーバーから取得しているものです。2 つのオブジェクト。

[{"description":"yolo.","name":"ye","id":1},{"description":"sMITH","name":"John","id":2}]

どんな助けでも大歓迎です......ありがとう。

    NSData *response = [NSURLConnection sendSynchronousRequest:request returningResponse:&urlResponse error:&requestError];
    SBJsonParser *jsonParser = [[SBJsonParser alloc] init];
    NSArray *jsonObjects = [jsonParser objectWithData:response];
    NSMutableString *yolo = [[NSMutableString alloc] init];

            for ( int i = 0; i < [jsonObjects count]; i++ ) {
                NSDictionary *jsonDict = [jsonObjects objectAtIndex:i];
                NSString *IDID = [jsonDict objectForKey:@"id"];
                NSString *name = [jsonDict objectForKey:@"name"];

                NSLog(@"ID: %@", IDID); // THIS DISPLAYS

                [yolo appendString: IDID];    // THIS seems to be causing the new error...
                [yolo appendString:@": "];
                [yolo appendString: name];
                NSLog(@"%@", yolo);           // RETURNS NIL    
    }

編集:

現在、私の新しいエラーは...

キャッチされていない例外 'NSInvalidArgumentException' が原因でアプリを終了しています。理由: '-[NSDecimalNumber の長さ]: 認識されないセレクターがインスタンス 0x81b89f0 に送信されました'

4

5 に答える 5

3

あなた[jsonDict objectForKey:@"id"]NSNumber(またはNSDecimalNumber) であり、 ではないようNSStringです。NSString *IDID = [jsonDict objectForKey:@"id"];行を次のように変更する必要があります。

id myObject = [jsonDict objectForKey:@"id"];
NSString *IDID = nil;

if ([myObject isKindOfClass:[NSNumber class]]) {
   IDID = [[jsonDict objectForKey:@"id"] stringValue];
} else {
   IDID = [jsonDict objectForKey:@"id"];
}

このエラーは、以前に初期化しておらず、nil オブジェクトNSMutableString *yoloを使用していたため、現在表示されています。appendString:今では、入力として型のみを受け入れるオブジェクトをNSMutableString *yolo = [[NSMutableString alloc] init];呼び出そうとしているため、初期化されています。内部的に呼び出すメソッドです。したがって、これも変更する必要があります。appendStringNSMutableStringNSStringNSNumberlengthappendString:

于 2013-02-14T23:10:06.987 に答える
2

を初期化することはないyoloので、それnilを呼び出し-appendString:ている間だけです。これを試して:

NSMutableString *yolo = [NSMutableString string];
于 2013-02-14T22:40:09.440 に答える
2

NSMutableString を初期化しようとしましたか?

NSMutableString *yolo = [[NSMutableString alloc] init];
于 2013-02-14T22:40:26.500 に答える
1

JSON フィード経由でアプリに送信されるデータの種類を実際にチェックしていないようです。これは、ユーザーが実際にアプリを使用したときにランダムにクラッシュする場合に発生する可能性があります。また、アプリのレビュー中にそのようなクラッシュが発生した場合、App Store への拒否の理由になる可能性もあります。

メソッドを呼び出す前に、JSON から受け取るすべてのオブジェクトのタイプを確認する必要があります :)

ベスト プラクティスを実装することで、安定した使いやすいアプリを作成できます。データモデルを構築してデータを検証します。JSONModel のような JSON データ モデル フレームワークを使用することもできます: http://www.jsonmodel.com/

于 2013-02-14T23:16:40.957 に答える
0

「id」が文字列ではなく数値であることは、データから明らかです。ポインターを NSString* に割り当てても、魔法のように NSString* に変換されるわけではありません。そして、例外から、あるオブジェクトが NSString だと思っていたときに NSDecimalNumber であることがわかったことは明らかです。

したがって、IDID は NSNumber* であり、それを NSString* のふりをするとクラッシュします。

于 2014-03-18T15:17:30.153 に答える