0

httpリクエストを介して外部サーバーからログインフォームの読み取りを構築し始めていますユーザー名を取得するためにjsonの結果を解析する必要があります

- (IBAction)getlogin:(UIButton *)sender {
    NSString *rawStrusername = [NSString stringWithFormat:@"username=%@",_username.text];
    NSString *rawStrpassword = [NSString stringWithFormat:@"password=%@",_password.text];
    NSString *post = [NSString stringWithFormat:@"%@&%@", rawStrusername, rawStrpassword];
    // NSString *post = @"rawStrusername&rawStrpassword";
    NSData *postData = [post dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES];

    /* NSString *postLength = [NSString stringWithFormat:@"%d", [postData length]]; */

    NSURL *url = [NSURL URLWithString:@"http://www.othaimmarkets.com/my_services_path/user/login.json"];
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];

    [request setHTTPMethod:@"POST"];

    /* [request setValue:postLength forHTTPHeaderField:@"Content-Length"]; */

    [request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"];
    [request setHTTPBody:postData];

    NSURLResponse *response;
    NSError *err;
    NSData *responseData = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&err];

    NSLog(@"responseData: %@", [[NSString alloc] initWithData:responseData encoding:NSUTF8StringEncoding]);
    //NSLog(@"responseData: %@", responseData);
}

私はこの結果を得る:

{"sessid": "g2ev7til6d750ducrkege0cbj2"、 "session_name": "SESS02795057fe9e6b2fc0777bf4057b248f"、 "user":{"uid": "617"、 "name": "mohammed.abdelrasoul@gmail.com"、 "mail": "mo .abdelrasoul @ gmail.com "、" mode ":" 0 "、" sort ":" 0 "、" threshold ":" 0 "、" theme ":" "、" signature ":" "、" signature_format ": "0"、 "created": "1316602317"、 "access": "1352643854"、 "login": "1352666338"、 "status": "1"、 "timezone": "10800"、 "language": "ar "、" pictures ":" "、" init ":" mohammed.abdelrasoul@gmail.com "、" data ":"a:5:{s:18:\ "country_iso_code_2 \"; s:2:\ "SA \"; s:13:\ "timezone_name \"; s:11:\ "Asia / Riyadh \"; s:5 :\ "block \"; a:1:{s:7:\ "webform \"; a:1:{s:15:\ "client-block-88 \"; i:1;}} s:13 :\ "form_build_id \"; s:37:\ "form-3ae73833f08accc7abe5517347ea87eb \"; s:7:\ "contact \"; i:0;} "、" country_iso_code_2 ":" SA "、" timezone_name ":" Asia / Riyadh "、" block ":{" webform ":{" client-block-88 ":1"}、 "form_build_id": "form-3ae73833f08accc7abe5517347ea87eb"、 "contact":0、 "roles":{"2" :"認証されたユーザー"}}}webform \ "; a:1:{s:15:\" client-block-88 \ "; i:1;}} s:13:\" form_build_id \ "; s:37:\" form-3ae73833f08accc7abe5517347ea87eb \ " ; s:7:\ "contact \"; i:0;} "、" country_iso_code_2 ":" SA "、" timezone_name ":" Asia / Riyadh "、" block ":{" webform ":{" client-block -88 ":1"}、 "form_build_id": "form-3ae73833f08accc7abe5517347ea87eb"、 "contact":0、 "roles":{"2":"認証されたユーザー"}}}webform \ "; a:1:{s:15:\" client-block-88 \ "; i:1;}} s:13:\" form_build_id \ "; s:37:\" form-3ae73833f08accc7abe5517347ea87eb \ " ; s:7:\ "contact \"; i:0;} "、" country_iso_code_2 ":" SA "、" timezone_name ":" Asia / Riyadh "、" block ":{" webform ":{" client-block -88 ":1"}、 "form_build_id": "form-3ae73833f08accc7abe5517347ea87eb"、 "contact":0、 "roles":{"2":"認証されたユーザー"}}}client-block-88 ":1"}、 "form_build_id": "form-3ae73833f08accc7abe5517347ea87eb"、 "contact":0、 "roles":{"2":"認証されたユーザー"}}}client-block-88 ":1"}、 "form_build_id": "form-3ae73833f08accc7abe5517347ea87eb"、 "contact":0、 "roles":{"2":"認証されたユーザー"}}}

または、読みやすくするためにフォーマットされています。

{
   "sessid":"g2ev7til6d750ducrkege0cbj2",
   "session_name":"SESS02795057fe9e6b2fc0777bf4057b248f",
   "user":{
      "uid":"617",
      "name":"mohammed.abdelrasoul@gmail.com",
      "mail":"mohammed.abdelrasoul@gmail.com",
      "mode":"0",
      "sort":"0",
      "threshold":"0",
      "theme":"",
      "signature":"",
      "signature_format":"0",
      "created":"1316602317",
      "access":"1352643854",
      "login":"1352666338",
      "status":"1",
      "timezone":"10800",
      "language":"ar",
      "picture":"",
      "init":"mohammed.abdelrasoul@gmail.com",
      "data":"a:5:{s:18:\"country_iso_code_2\";s:2:\"SA\";s:13:\"timezone_name\";s:11:\"Asia/Riyadh\";s:5:\"block\";a:1:{s:7:\"webform\";a:1:{s:15:\"client-block-88\";i:1;}}s:13:\"form_build_id\";s:37:\"form-3ae73833f08accc7abe5517347ea87eb\";s:7:\"contact\";i:0;}",
      "country_iso_code_2":"SA",
      "timezone_name":"Asia/Riyadh",
      "block":{
         "webform":{
            "client-block-88":1
         }
      },
      "form_build_id":"form-3ae73833f08accc7abe5517347ea87eb",
      "contact":0,
      "roles":{
         "2":"authenticated user"
      }
   }
}

オブジェクトデータを取得する方法、または結果を解析してユーザー名を取得する方法ヘルプや例をいただければ幸いです

4

4 に答える 4

2

NSJSONSerialization クラス メソッド JSONObjectWithData:options:error: を使用して、NSDictionary を作成する必要があります。

NSError *error;
NSDictionary *jsonDict = [NSJSONSerialization JSONObjectWithData:responseData options:NSJSONReadingMutableContainers error:&error];
if (! error) {
    NSLog(@"%@",jsonDict);
}else{
    NSLog(@"%@",error.localizedDescription);
}

これにより、辞書を見ることができるようになり、読みやすくなります。objectForKey:@"sessid" を使用してユーザーを取得し、次に objectForKey@"user"、次に objectForKey:@"name" を使用して名前を取得する必要があるようです。

于 2012-11-11T22:16:49.413 に答える
1

json を解析するためのこのフレームワークを確認してください。https://github.com/stig/json-framework/

この回答iPhone/iOS JSON parsing tutorialも確認してください。iOS での json 解析に慣れるためのチュートリアルへのリンクがあります。

于 2012-11-11T22:14:24.517 に答える
0

この回答といくつかのコードを参照してください:

NSMutableData *data; // Contains data received from the URL connection declares in header


- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)dataIn 
{ 
// Do it this way because connection doesn't guarantee all the data is in
POLLog(@" Tide View connection");
[data appendData:dataIn];
}


- (void) connectionDidFinishLoading:(NSURLConnection *) conn 
{

NSString *jsonString = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
NSDictionary *results = [jsonString JSONValue]; // This is a new category added to the NSString by SBJSON
//100 parameters
for (int n=0;n<=100;n++)
    {
        // Get all the returned results
        params[n] = [[results objectForKey:[NSString stringWithFormat:@"param%d",n]] floatValue];

    }
于 2012-11-11T22:22:34.553 に答える
0

rdelmar の回答(これを受け入れる必要があると思います) を拡張するには、結果を使用しNSJSONSerializationてナビゲートし、次NSDictionaryを抽出しuserNameます。

NSError *error;
NSDictionary *jsonDict = [NSJSONSerialization JSONObjectWithData:responseData
                                                         options:0
                                                           error:&error];
if (error == nil) {
    NSDictionary *userDictionary = [jsonDict objectForKey:@"user"];
    NSString *userName = [userDictionary objectForKey:@"name"];

    // do what you need with the userName

} else {
    NSLog(@"%@",error.localizedDescription);
}

または、Xcode の最新バージョンを使用している場合は、これらのobjectForKey参照をさらに簡潔な最新の Objective-C構文に置き換えることができます。

    NSDictionary *userDictionary = jsonDict[@"user"];
    NSString *userName = userDictionary[@"name"];
于 2012-11-12T03:09:43.337 に答える