1

JSON データを取得して UILabel にテキストとして表示しようとしていますが、次のエラーでアプリがクラッシュし続けます -[__NSCFString objectAtIndex:]: unrecognized selector sent to instance 0x1f8cfff0?

これが私のコードとjson応答です。ログに、呼び出しから名前を取得していることがわかりますが、アプリはそのエラーを爆撃します。2 つの UILabel ブロッ​​クがあり、そのうちの 1 つは json 応答のテキスト形式を示し、もう 1 つは実際の json 応答をテキストで示しています。

その人物の名前を取得しようとしています。JSON が戻ってきたときに、ログに Bilbo Baggins が表示されます。

これが私のjson出力です:

{"ProfileID":34,"ProfilePictureID":20,"Name":"Bilbo Baggins","Clients":[{"ClientID":91,"Name":"Fnurky"},{"ClientID":92,"Name":"A different client"},{"ClientID":95,"Name":"Second Community"},{"ClientID":96,"Name":"Britehouse"}]}

私のコードは、それをテキストとしてuilabelとして表示しようとしています。

#define kBgQueue dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0) //1
#define kLatestKivaLoansURL [NSURL URLWithString: @"http://www.ddproam.co.za/Central/Profile/JSONGetProfileForUser"] //2

#import "JsonViewController.h"

@interface NSDictionary(JSONCategories)
+(NSDictionary*)dictionaryWithContentsOfJSONURLString:(NSString*)urlAddress;
-(NSData*)toJSON;
@end

@implementation NSDictionary(JSONCategories)
+(NSDictionary*)dictionaryWithContentsOfJSONURLString:(NSString*)urlAddress
{
NSData* data = [NSData dataWithContentsOfURL: [NSURL URLWithString: urlAddress] ];
__autoreleasing NSError* error = nil;
id result = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:&error];
if (error != nil) return nil;
return result;
}

-(NSData*)toJSON
{
NSError* error = nil;
id result = [NSJSONSerialization dataWithJSONObject:self options:kNilOptions error:&error];
if (error != nil) return nil;
return result;    
}
@end

@implementation JsonViewController

- (void)viewDidLoad
{
[super viewDidLoad];

dispatch_async(kBgQueue, ^{
    NSData* data = [NSData dataWithContentsOfURL: kLatestKivaLoansURL];
    [self performSelectorOnMainThread:@selector(fetchedData:) withObject:data waitUntilDone:YES];
});
}

 - (void)fetchedData:(NSData *)responseData {
//parse out the json data
NSError* error;
NSDictionary* json = [NSJSONSerialization JSONObjectWithData:responseData //1
                                                     options:kNilOptions 
                                                       error:&error];
NSArray* defineJsonData = [json objectForKey:@"Name"]; //2

NSLog(@"Name: %@", defineJsonData); //3

// 1) Get the latest loan
NSDictionary* loan = [defineJsonData objectAtIndex:0];


// 3) Set the label appropriately
humanReadble.text = [NSString stringWithFormat:@"Hello: %@",
                     [(NSDictionary*)[loan objectForKey:@"Name"] objectForKey:@"Name"]];

//build an info object and convert to json
NSDictionary* info = [NSDictionary dictionaryWithObjectsAndKeys:
                      [loan objectForKey:@"Name"],
                      nil];

//convert object to data
NSData* jsonData = [NSJSONSerialization dataWithJSONObject:info 
                                                   options:NSJSONWritingPrettyPrinted
                                                     error:&error];

//print out the data contents
jsonSummary.text = [[NSString alloc] initWithData:jsonData
                                         encoding:NSUTF8StringEncoding];

}

@end
4

1 に答える 1

2

申し訳ありませんが、不適切な var 名と複雑な構造で失われたものの組み合わせです。

最初: ここでは、完全な JSON をディクショナリとして取得します。

NSDictionary* json = [NSJSONSerialization JSONObjectWithData:responseData //1
                                                     options:kNilOptions 
                                                       error:&error];

あなたのQによると、これは次の構造を持っています:

{
   "ProfileID":34,
   "ProfilePictureID":20,
   "Name":"Bilbo Baggins",
   "Clients":
   [
      {
         "ClientID":91,
         "Name":"Fnurky"
      },
      {  
         "ClientID":92,
         "Name":"A different client"
      },
      {
         "ClientID":95,
         "Name":"Second Community"
      },
      {
         "ClientID":96,
         "Name":"Britehouse"
      }
   ]
}

2 番目: 次のステートメントでは、明らかに人物のようなものの名前を取得します。

NSArray* defineJsonData = [json objectForKey:@"Name"]; //2

ルートがあります:

得られるもの – JSON を見てください – は次のとおりです。

   "Name":"Bilbo Baggins",
  • key のオブジェクトを取得しますName。結果への参照を保持する var は、これを表現して呼び出す必要があります。これを変更しましょう:

    NSArray* name = [json objectForKey:@"名前"]; //2

  • 次に、JSON を見てください。そのキーの背後にあるオブジェクトは のインスタンスでありNSString、 ではありませんNSArray。これを修復しましょう:

    NSString* name = [json objectForKey:@"名前"]; //2

三番:

そうすることで、コンパイラはエラーをスローします。これは、次のステートメントによるものです。

NSDictionary* loan = [defineJsonData objectAtIndex:0];

新しい変数名に変更:

NSDictionary* loan = [name objectAtIndex:0];

コンパイラは正しいです。配列がないため、送信できませんobjectAtIndex:

于 2013-05-16T08:57:36.023 に答える