আমি কীভাবে জেএসএনকে উদ্দেশ্য-সি দিয়ে পার্স করব?


114

আমি আইফোনে নতুন এই ডেটাটিকে বিশ্লেষণ করতে এবং ক্রিয়াকলাপের বিশদ, প্রথম নাম এবং পদবি এবং শেষ নাম পেতে আমাকে কি অনুসরণের পদক্ষেপগুলি বলতে পারেন?

{
    "#error": false, 
    "#data": {
        "": {
            "activity_id": "35336", 
            "user_id": "1", 
            "user_first_name": "Chandra Bhusan", 
            "user_last_name": "Pandey", 
            "time": "1300870420", 
            "activity_details": "Good\n", 
            "activity_type": "status_update", 
            "photo_url": "http://184.73.155.44/hcl-meme/QA_TEST/sites/default/files/pictures/picture-1627435117.jpg"
        }, 
        "boolean": "1", 
        "1": {
            "1": {
                "photo_1_id": "9755"
            }, 
            "activity_id": "35294", 
            "album_name": "Kalai_new_Gallery", 
            "user_id": "31", 
            "album_id": "9754", 
            "user_first_name": "Kalaiyarasan", 
            "user_last_name": "Balu", 
            "0": {
                "photo_0_id": "9756"
            }, 
            "time": "1300365758", 
            "activity_type": "photo_upload", 
            "photo_url": "http://184.73.155.44/hcl-meme/QA_TEST/"
        }, 
        "3": {
            "activity_id": "35289", 
            "user_id": "33", 
            "user_first_name": "Girija", 
            "user_last_name": "S", 
            "time": "1300279636", 
            "activity_details": "girija Again\n", 
            "activity_type": "status_update", 
            "photo_url": "http://184.73.155.44/hcl-meme/QA_TEST/sites/default/files/pictures/picture-33-6361851323080768.jpg"
        }, 
        "2": {
            "owner_first_name": "Girija", 
            "activity_id": "35290", 
            "activity_details": "a:2:{s:4:\"html\";s:51:\"!user_fullname and !friend_fullname are now friends\";s:4:\"type\";s:10:\"friend_add\";}", 
            "activity_type": "friend accept", 
            "owner_last_name": "S", 
            "time": "1300280400", 
            "photo_url": "http://184.73.155.44/hcl-meme/QA_TEST/sites/default/files/pictures/picture-33-6361851323080768.jpg", 
            "owner_id": "33"
        }, 
        "4": {
            "activity_id": "35288", 
            "user_id": "33", 
            "user_first_name": "Girija", 
            "user_last_name": "S", 
            "time": "1300279530", 
            "activity_details": "girija from mobile\n", 
            "activity_type": "status_update", 
            "photo_url": "http://184.73.155.44/hcl-meme/QA_TEST/sites/default/files/pictures/picture-33-6361851323080768.jpg"
        }
    }
}

1
নিশ্চিত হয়ে নিন যে আপনি কোনও উত্তর গ্রহণযোগ্য হিসাবে চিহ্নিত করেছেন যদি এটি আপনার কারণটিকে সহায়তা করে।
রডু ফ্লোরস্কু

উত্তর:


174

ওএস এক্স ভি 10.7 এবং আইওএস 5 লঞ্চগুলির দৃষ্টিকোণের সাথে, সম্ভবত এখন প্রথম পরামর্শ দেওয়া হ'ল NSJSONSerializationঅ্যাপল সরবরাহিত জেএসএন পার্সার। তৃতীয় পক্ষের বিকল্পগুলি কেবল ফ্যালব্যাক হিসাবে ব্যবহার করুন যদি আপনি ক্লাসটি রানটাইমটিতে অনুপলব্ধ বলে মনে করেন।

সুতরাং, উদাহরণস্বরূপ:

NSData *returnedData = ...JSON data, probably from a web request...

// probably check here that returnedData isn't nil; attempting
// NSJSONSerialization with nil data raises an exception, and who
// knows how your third-party library intends to react?

if(NSClassFromString(@"NSJSONSerialization"))
{
    NSError *error = nil;
    id object = [NSJSONSerialization
                      JSONObjectWithData:returnedData
                      options:0
                      error:&error];

    if(error) { /* JSON was malformed, act appropriately here */ }

    // the originating poster wants to deal with dictionaries;
    // assuming you do too then something like this is the first
    // validation step:
    if([object isKindOfClass:[NSDictionary class]])
    {
        NSDictionary *results = object;
        /* proceed with results as you like; the assignment to
        an explicit NSDictionary * is artificial step to get 
        compile-time checking from here on down (and better autocompletion
        when editing). You could have just made object an NSDictionary *
        in the first place but stylistically you might prefer to keep
        the question of type open until it's confirmed */
    }
    else
    {
        /* there's no guarantee that the outermost object in a JSON
        packet will be a dictionary; if we get here then it wasn't,
        so 'object' shouldn't be treated as an NSDictionary; probably
        you need to report a suitable error condition */
    }
}
else
{
    // the user is using iOS 4; we'll need to use a third-party solution.
    // If you don't intend to support iOS 4 then get rid of this entire
    // conditional and just jump straight to
    // NSError *error = nil;
    // [NSJSONSerialization JSONObjectWithData:...
}

1
আপনি পোস্ট করতে পারেন এটি কীভাবে কাজ করে তার কোনও উদাহরণ? আমি অ্যাপলের নথিভুক্তির সন্ধান করছি।
রবার্ট কার্ল

@ রবার্ট কার্ল আমি আমার উত্তর আপডেট করেছি; আশা করি যে বিষয়গুলি স্পষ্ট করে দেয়?
টমি

হ্যাঁ! আপনাকে ধন্যবাদ, এটি সহায়ক। বিশেষত, বিকল্পগুলির জন্য কী পাস করতে হবে এবং ত্রুটির পরামিতি কোনও কাজের উদাহরণ ছাড়াই কিছুটা রহস্যময় (আমি তাদের ডকুমেন্টেশনে একটিও পাইনি)। বিকাশকারী কেন ত্রুটি নির্দেশকের রেফারেন্সটি পাস করে তা আমার কাছে রহস্যজনক থাকে।
রবার্ট কার্ল

1
@ রবার্টকার্ল এটি এমন একটি পদ্ধতি থাকার সহজ উপায় যা একটির পরিবর্তে দুটি জিনিস ফেরত দেয়; এটির অর্থ সাধারণত দ্বিতীয়টি হ'ল alচ্ছিক that সেই প্যাটার্ন সহ বেশিরভাগ পদ্ধতির জন্য, শূন্য সরবরাহ সরবরাহ বৈধ এবং কেবলমাত্র সেই তথ্য না পাওয়ার ফলস্বরূপ results
টমি

হ্যাঁ আমি খুব খুশি অ্যাপল অবশেষে যুক্ত NSJSONSerialization। আমি এখন পরিবর্তে এটি ব্যবহার json-framework
অ্যালেক্স

23

চাকা পুনরুদ্ধার করবেন না। জসন-ফ্রেমওয়ার্ক বা অনুরূপ কিছু ব্যবহার করুন ।

আপনি যদি জসন-ফ্রেমওয়ার্ক ব্যবহার করার সিদ্ধান্ত নেন, আপনি এখানে কোনও JSON স্ট্রিংকে কীভাবে পার্স করবেন NSDictionary:

SBJsonParser* parser = [[[SBJsonParser alloc] init] autorelease];
// assuming jsonString is your JSON string...
NSDictionary* myDict = [parser objectWithString:jsonString];

// now you can grab data out of the dictionary using objectForKey or another dictionary method

3
'অনুরূপ কিছু' হিসাবে, json.org উদ্দেশ্য-সি এর জন্য পাঁচটি জেএসএন পার্সার তালিকাভুক্ত করে।

4
মনে রাখবেন যে এর লাইসেন্সটি কোনও স্ট্যান্ডার্ড ওপেন সোর্স লাইসেন্স নয়। গ্রন্থাগারটি ব্যবহারের আগে আপনাকে এটি পর্যালোচনা করতে হতে পারে।
রবীন্দ্রনাথ আকিলা

2
এটি ব্যবহার করে কি সত্যিই কোনও সুবিধা সরবরাহ করে NSJSONSerialization?
কিরণ

কেন ত্রুটি তৈরি করুন: 'এসবিজেসন 4 পার্সার' এর জন্য কোনও অভ্যন্তরীণ চিত্র নির্বাচককে 'অবজেক্ট উইথস্ট্রিং:' হিসাবে ঘোষণা করে না
গ্যাঙ্ক

7
এটি দেওয়া সবচেয়ে খারাপ পরামর্শের মধ্যে সত্যিই। আপনি যখন কোনও জটিল কিছু আঘাত করেন তখন কীভাবে জিনিসগুলি কীভাবে কাজ করে সেগুলি সম্পর্কে কী তা শিখতে এবং বুঝতে এটি গুরুত্বপূর্ণ teach তৃতীয় পক্ষের ফ্রেমওয়ার্কগুলি কোনও রূপালী বুলেট নয় এবং এটি বাগ, অদক্ষতা বা কেবল স্তন্যপান দিয়ে ছাঁটা যায়। আপনার একটি কাঠামো ব্যবহার করা উচিত এবং এটি সম্পর্কে উদ্বিগ্ন হওয়া উচিত না বলাই যেহেতু আপনি যা বলছেন তা হ'ল "শিখবেন না, কেবল একটি কাঠামো ব্যবহার করুন এবং সময় সাশ্রয় করুন" এটি দেওয়া সবচেয়ে খারাপ পরামর্শ।
TheM00s3

21
NSString* path  = [[NSBundle mainBundle] pathForResource:@"index" ofType:@"json"];

//将文件内容读取到字符串中,注意编码NSUTF8StringEncoding 防止乱码,
NSString* jsonString = [[NSString alloc] initWithContentsOfFile:path encoding:NSUTF8StringEncoding error:nil];

//将字符串写到缓冲区。
NSData* jsonData = [jsonString dataUsingEncoding:NSUTF8StringEncoding];

NSError *jsonError;
id allKeys = [NSJSONSerialization JSONObjectWithData:jsonData options:NSJSONWritingPrettyPrinted error:&jsonError];


for (int i=0; i<[allKeys count]; i++) {
    NSDictionary *arrayResult = [allKeys objectAtIndex:i];
    NSLog(@"name=%@",[arrayResult objectForKey:@"storyboardName"]);

}

ফাইল:

 [
  {
  "ID":1,
  "idSort" : 0,
  "deleted":0,
  "storyboardName" : "MLMember",
  "dispalyTitle" : "76.360779",
  "rightLevel" : "10.010490",
  "showTabBar" : 1,
  "openWeb" : 0,
  "webUrl":""
  },
  {
  "ID":1,
  "idSort" : 0,
  "deleted":0,
  "storyboardName" : "0.00",
  "dispalyTitle" : "76.360779",
  "rightLevel" : "10.010490",
  "showTabBar" : 1,
  "openWeb" : 0,
  "webUrl":""
  }
  ]

12

জেএসএন এনএসজেএসএসনারাইজেশন ব্যবহার করে পার্সিং করছে ing

   NSString* path  = [[NSBundle mainBundle] pathForResource:@"data" ofType:@"json"];
   
    //Here you can take JSON string from your URL ,I am using json file
    NSString* jsonString = [[NSString alloc] initWithContentsOfFile:path encoding:NSUTF8StringEncoding error:nil];
    NSData* jsonData = [jsonString dataUsingEncoding:NSUTF8StringEncoding];
    NSError *jsonError;
    NSArray *jsonDataArray = [NSJSONSerialization JSONObjectWithData:[jsonString dataUsingEncoding:NSUTF8StringEncoding] options:kNilOptions error:&jsonError];
  
    NSLog(@"jsonDataArray: %@",jsonDataArray);

    NSDictionary *jsonObject = [NSJSONSerialization JSONObjectWithData:jsonData options:kNilOptions error:&jsonError];
if(jsonObject !=nil){
   // NSString *errorCode=[NSMutableString stringWithFormat:@"%@",[jsonObject objectForKey:@"response"]];
   
        
        if(![[jsonObject objectForKey:@"#data"] isEqual:@""]){
            
            NSMutableArray *array=[jsonObject objectForKey:@"#data"];
             // NSLog(@"array: %@",array);
            NSLog(@"array: %d",array.count);  
            
            int k = 0;
            for(int z = 0; z<array.count;z++){
                
                NSString *strfd = [NSString stringWithFormat:@"%d",k];
                NSDictionary *dicr = jsonObject[@"#data"][strfd];
                k=k+1;
                // NSLog(@"dicr: %@",dicr);
                 NSLog(@"Firstname - Lastname   : %@ - %@",
                     [NSMutableString stringWithFormat:@"%@",[dicr objectForKey:@"user_first_name"]],
                     [NSMutableString stringWithFormat:@"%@",[dicr objectForKey:@"user_last_name"]]);
            }
            
          }

     }

আপনি নীচের মত কনসোল আউটপুট দেখতে পারেন:

প্রথম নাম - শেষ নাম: চন্দ্র ভূষণ - পান্ডে

প্রথম নাম - শেষ নাম: কালাইয়ারাছন - বালু

প্রথম নাম - শেষ নাম: (নাল) - (নাল)

প্রথম নাম - শেষ নাম: গিরিজা - এস

প্রথম নাম - শেষ নাম: গিরিজা - এস

প্রথম নাম - শেষ নাম: (নাল) - (নাল)


6
  1. আমি JSON পার্স করার জন্য টাচজেসনকে সুপারিশ করি এবং ব্যবহার করি
  2. অ্যালেক্স আপনার মন্তব্যের জবাব দিতে। এখানে দ্রুত কোড যা আপনাকে জেসন অভিধান থেকে ফিরে আসা ক্রিয়াকলাপ_বিস্তারণ, শেষ নাম, ইত্যাদি ক্ষেত্রগুলি পেতে দেয়:

    NSDictionary *userinfo=[jsondic valueforKey:@"#data"];
    NSDictionary *user;
    NSInteger i = 0;
    NSString *skey;
    if(userinfo != nil){
        for( i = 0; i < [userinfo count]; i++ ) {
            if(i)
                skey = [NSString stringWithFormat:@"%d",i];
            else
                skey = @"";
    
            user = [userinfo objectForKey:skey];
            NSLog(@"activity_details:%@",[user objectForKey:@"activity_details"]);
            NSLog(@"last_name:%@",[user objectForKey:@"last_name"]);
            NSLog(@"first_name:%@",[user objectForKey:@"first_name"]);
            NSLog(@"photo_url:%@",[user objectForKey:@"photo_url"]);
        }
    }
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.