سؤال

لدي استجابة JSON التي لا أستطيع معرفة كيفية تعيينها.تبدو هكذا:

{
  "responseError": null,
  "displayMenuList": {
    "MenuList": [
      {
        "ID": "3223",
        "Name": "Main",
        "AddressURL": "www.mysite.com",
        "DisplayType": "True",
        "ImageURL": "main.png",
        "NotSplitBUser": "True",
        "ParentCategoryId": "3223",
        "PrivateUser": "True",
        "SortOrder": 1,
        "SplitBUser": "True",
        "TargetURL": "_self"
      },
      {
        "ID": "3307",
        "Name": "Contact",
        "AddressURL": "www.mysite.com",
        "DisplayType": "True",
        "ImageURL": "service.png",
        "NotSplitBUser": "True",
        "ParentCategoryId": "3224",
        "PrivateUser": "True",
        "SortOrder": 0,
        "SplitBUser": "True",
        "TargetURL": "_self"
      },
      {
        "ID": "3298",
        "Name": "Call Us",
        "AddressURL": "www.mysite.com",
        "DisplayType": "True",
        "ImageURL": "service.png",
        "NotSplitBUser": "True",
        "ParentCategoryId": "3224",
        "PrivateUser": "True",
        "SortOrder": 1,
        "SplitBUser": "True",
        "TargetURL": "_self"
      },
      {
        "ID": "3224",
        "Name": "Service",
        "AddressURL": "www.mysite.com",
        "DisplayType": "True",
        "ImageURL": "service.png",
        "NotSplitBUser": "True",
        "ParentCategoryId": "3224",
        "PrivateUser": "True",
        "SortOrder": 2,
        "SplitBUser": "True",
        "TargetURL": "_self"
      }
    ]
  },
  "responseCurrentBillState": null,
  "responseGetPcrfSubBuckets": null,
  "userData": {
    "abroadInd": null,
    "accountType": "B",
    "customerId": "",
    "fullName": "Juan",
    "subscriberNumber": ""
  }
}

لا أستطيع معرفة كيفية تعيين تلك الكائنات، لقد قمت بإنشاء كائن يسمى RKSideMenu, ، وهو أيضًا كائن يسمى RKUserData أنها تبدو مثل هذا:

@interface RKSideMenu : NSObject
@property (copy, nonatomic) NSString *addressURL;
@property (copy, nonatomic) NSString *displayType;
@property (copy, nonatomic) NSNumber *id_number;
@property (copy, nonatomic) NSString *imageURL;
@property (copy, nonatomic) NSString *name;
@property (assign, nonatomic) BOOL splitBUser;
+ (NSDictionary*)getAttributes;
@end

@implementation RKSideMenu
+ (NSDictionary*)getAttributes
{
    return [NSDictionary dictionaryWithObjects:@[@"addressURL", @"displayType", @"id_number", @"imageURL", @"name", @"splitBUser"]
                                       forKeys:@[@"AddressURL", @"DisplayType", @"ID", @"ImageURL", @"Name", @"SplitBUser"]];
}
@end

@interface RKUserData : NSObject
@property (copy, nonatomic) NSString *abroadInd;
@property (copy, nonatomic) NSString *accountType;
@property (copy, nonatomic) NSString *customerID;
@property (copy, nonatomic) NSString *fullName;
@property (copy, nonatomic) NSString *subscriberNumber;
+ (NSDictionary*)getAttributes;
@end

@implementation RKUserData
+ (NSDictionary*)getAttributes
{
    return [NSDictionary dictionaryWithObjects:@[@"abroadInd", @"accountType", @"customerID", @"fullName;", @"subscriberNumber"]
                                       forKeys:@[@"abroadInd", @"accountType", @"customerId", @"fullName;", @"subscriberNumber"]];
}
@end

لقد بدأت في رسم الخرائط بهاتين الطريقتين، ولكنني توقفت ولم أعرف ماذا أفعل.أنا أنظر https://github.com/RestKit/RestKit/wiki/Object-mapping, ، ولكن لا يزال غير قادر على القيام بذلك بشكل صحيح.

RKObjectMapping *sideMenuMapping = [RKObjectMapping mappingForClass:[RKSideMenu class]];
[sideMenuMapping addAttributeMappingsFromDictionary:[RKSideMenu getAttributes]];

RKObjectMapping *userDataMapping = [RKObjectMapping mappingForClass:[RKUserData class]];
[userDataMapping addAttributeMappingsFromDictionary:[RKUserData getAttributes]];

شكرا لك مقدما!

يحرر:تم استبدال Json في الأعلى بـ json حقيقي من الخادم.

هل كانت مفيدة؟

المحلول

إذن ما عليك القيام به لإعداد التعيين الخاص بك هو أولاً وقبل كل شيء تحديد عنوان URL الأساسي لواجهة برمجة التطبيقات الخاصة بك، كما يلي:

AFHTTPClient *client = [AFHTTPClient clientWithBaseURL:[NSURL URLWithString:@"URL_TO_YOUR_API"]];
RKObjectManager *objectManager = [[RKObjectManager alloc] initWithHTTPClient:client];

فأنت بحاجة بعد ذلك إلى تعيين واصف استجابة لعنوان url الذي يُخرج ملف json أعلاه:

[[RKObjectManager sharedManager] addResponseDescriptor:[RKResponseDescriptor responseDescriptorWithMapping:sideMenuMapping
                                                                                                    method:RKRequestMethodAny
                                                                                               pathPattern:@"/mainScreenData"
                                                                                                   keyPath:@"displayMenuList.MenuList"
                                                                                               statusCodes:RKStatusCodeIndexSetForClass(RKStatusCodeClassSuccessful)]];

يجب استبدال "RKRequestMethodAny" بطريقة الطلب التي تستخدمها على سبيل المثال."RKRequestMethodGET".

ثم يمكنك فقط استرداد الكائنات عن طريق الاتصال:

  [[RKObjectManager sharedManager] getObjectsAtPath:@"/mainScreenData"
                   parameters:nil
                      success:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult) {

                          NSArray *sideMenuList = [NSMutableArray arrayWithArray:[mappingResult array]];
                      }
                      failure:^(RKObjectRequestOperation *operation, NSError *error) {
                          NSLog(@"%@",[error localizedDescription]);
                      }];  

أوصي بشدة بإلقاء نظرة على العروض التوضيحية التي تقدمها RestKit.وهذا يجعل العملية برمتها أكثر وضوحا.

هتافات،
سيباستيان

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top