0

データベースからデータを取得し、JSON で Iphone に送信する Web サービスがあります。

マイ Web サービス:

[ScriptMethod(ResponseFormat = ResponseFormat.Json)]
       [WebMethod]
       public string Person()
       {
           return Helper.Person();
       }

私の Helper.cs

public class Helper
{
   internal static string Person()
   {
       List<object> person = new List<object>();

       using (SqlConnection con = new SqlConnection(@"Data Source=Localhost\SQLEXPRESS;Initial Catalog=BOOK-IT-V2;Integrated Security=true;"))
       using (SqlCommand cmd = new SqlCommand(@"SELECT EMAIL FROM PERSON", con))
       {
           con.Open();
           using (SqlDataReader rdr = cmd.ExecuteReader())
           {
               while (rdr.Read())
               {
                   if (rdr["EMAIL"] != DBNull.Value)
                   {
                       raumKlassenObject.Add(new {
                           Email=rdr["EMAIL"].ToString()});
                   }
               }
           }
       }

       return new JavaScriptSerializer().Serialize(person.ToArray());
   }
}

Xcode の場合:

  #import "RaumklasseViewController.h"

@interface RaumklasseViewController ()

@end

@implementation RaumklasseViewController
@synthesize result;
@synthesize dic;
@synthesize array;



- (id)initWithStyle:(UITableViewStyle)style
{
    self = [super initWithStyle:style];
    if (self) {
        // Custom initialization
    }
    return self;
}
- (void) sendRequest:(NSString*)jsonText
{
    NSURL *url = [[NSURL alloc]initWithString:@"http://ndqqxtsdsdoludwons-entwickludng.de/Webdiendst22/service1.asmx/Raumklasse"];
    NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init];
    request = [NSMutableURLRequest requestWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:10];
    [request setHTTPMethod: @"POST"];
    [request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
    NSData *reqData = [NSData dataWithBytes:[jsonText UTF8String] length:[jsonText length]];
    [request setHTTPBody:reqData];
    NSURLResponse *response =[[NSURLResponse alloc]init];
    NSError* error;
    result = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];

}
- (void)viewDidLoad

{
    [super viewDidLoad];
    [self sendRequest:@""];
    dic = [NSJSONSerialization JSONObjectWithData:result options:kNilOptions error:nil];

    self.array= [dic objectForKey:@"d"];

    NSMutableArray *finalArray = [[NSMutableArray alloc] init];
    for(int n=0; n<[self.array count]; n++)
        [finalArray addObject:[[self.array objectAtIndex:n] objectForKey:@"Email"]];

}
- (void)viewDidUnload
{
    [super viewDidUnload];


}

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    return (interfaceOrientation == UIInterfaceOrientationPortrait);
}
#pragma mark - Table view data source

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{

    // Return the number of sections.
    return 1;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{


    return [self.array count];

}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"Cell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
    }
    cell.textLabel.text=[array objectAtIndex:indexPath.row];

    return cell;


}



@end

これまでのところ動作し、私の出力は次のとおりです。

[{"Email":"abcd@web.de"},{"Email":"acsb@web.de"},{"Email":"asbd@gmx.de"},{"Email":"abcdw@web.de"},{"Email":"absds@web.de"}]

しかし、私が試してみると

self.array = [[dic objectForKey:@"d"] objectForKey:@"Email"];

値のみを取得するには: abcd@web.de、acsb@web.de、asbd@gmx.de など。

だから私はエラーを取得しています:

 [__NSCFString objectForKey:]: unrecognized selector sent to instance 0x6a4ccb0.

Webservice が何か間違ったものを返していると思います。、しかし、私は何を知りません。多分あなたは私を助けることができます。

前もって感謝します。

4

2 に答える 2

2

問題はこれです:

[dic objectForKey@"d"]

辞書の配列を返します。ここで試しているように、objectForKeyで配列にアクセスすることはできません:

// the second objectForKey message is being sent to the array returned by the first objectForKey
[[dic objectForKey:@"d"] objectForKey:@"Email"];

ただし、valueForKey は配列に対して機能し、配列の各要素に対して valueForKey を呼び出した結果の新しい配列を返します。

NSArray *objects = [dict objectForKey:@"d"];
NSArray *emails = [objects valueForKey:@"Email"];

これにより、辞書の配列内のすべての電子メール アドレスが取得されます。

于 2012-06-05T17:02:34.653 に答える
0

各ディクショナリに 1 つのキーを持つディクショナリの配列があります ( "Email")。

objectForKey:ディクショナリのキーのオブジェクトを返すメソッドです。

このメソッドは配列では機能しないため、受信元の配列でこのメソッドを呼び出すことはできませ[dic objectForKey:@"d"]ん。

代わりにobjectAtIndex:次のように使用します。

self.array = [dic objectForKey:@"d"];
NSMutableArray *finalArray = [[NSMutableArray alloc] init];
for(int n=0; n<[self.array count]; n++)
    [finalArray addObject:[[self.array objectAtIndex:n] objectForKey:@"Email"]];

実行が完了するfinalArrayと、電子メールアドレスのみの文字列の配列が含まれます。

于 2012-06-05T17:00:44.497 に答える