将JSON字符串解析为Objective C对象数组

7

我有一个从rest web服务请求返回的JSON字符串, 我想将此字符串解析为特定类的对象数组, 这是JSON字符串

[
    {
        "validationCode": null,
        "FirstName": "Samer",
        "LastName": "Shame",
        "MobileNumber": "0991992993",
        "SimNumber": null,
        "Email": null,
        "PhoneNumber": "0991992994",
        "Name": "Abo Alshamat",
        "ID": 1
    },
    {
        "validationCode": null,
        "FirstName": "Ahmad",
        "LastName": "Ali",
        "MobileNumber": "0992993994",
        "SimNumber": null,
        "Email": null,
        "PhoneNumber": "0992993995",
        "Name": "AL-Kamal",
        "ID": 2
    },
    {
        "validationCode": null,
        "FirstName": null,
        "LastName": null,
        "MobileNumber": "0993377800",
        "SimNumber": null,
        "Email": null,
        "PhoneNumber": null,
        "Name": "Abo-MAhmoud",
        "ID": 12
    },
    {
        "validationCode": null,
        "FirstName": "William",
        "LastName": "Ammar",
        "MobileNumber": "0993994995",
        "SimNumber": null,
        "Email": null,
        "PhoneNumber": "0993994996",
        "Name": "Four Season",
        "ID": 3
    },
    {
        "validationCode": null,
        "FirstName": "Ammar",
        "LastName": "William",
        "MobileNumber": "0999555777",
        "SimNumber": null,
        "Email": null,
        "PhoneNumber": null,
        "Name": "uuuuu",
        "ID": 20
    },
    {
        "validationCode": null,
        "FirstName": null,
        "LastName": null,
        "MobileNumber": "0999888777",
        "SimNumber": null,
        "Email": null,
        "PhoneNumber": null,
        "Name": "NewOneFromI2",
        "ID": 18
    },
    {
        "validationCode": null,
        "FirstName": null,
        "LastName": null,
        "MobileNumber": "0999998997",
        "SimNumber": null,
        "Email": null,
        "PhoneNumber": "0999999998",
        "Name": "JOURY",
        "ID": 4
    },
    {
        "validationCode": null,
        "FirstName": null,
        "LastName": null,
        "MobileNumber": "202020",
        "SimNumber": null,
        "Email": null,
        "PhoneNumber": null,
        "Name": "TestTestRestaurant,Ammar,Hamed",
        "ID": 19
    }
]

我想要获取实例的类是:

@interface Restaurant : NSObject
@property (nonatomic,strong) NSString *ID;
@property (nonatomic,strong) NSString* FirstName;
@property (nonatomic,strong) NSString* LastName;
@property (nonatomic,strong) NSString* MobileNumber;
@property (nonatomic,strong) NSString* simNumber;
@property (nonatomic,strong) NSString* PhoneNumber;
@property (nonatomic,strong) NSString* Name;
@end

什么是最好的方法来做到这一点,抱歉也许问题很基础,但我是Objective C的新手。感谢您的时间。
2个回答

8
我建议为您的Restaurant类实现一个初始化方法。
-(instancetype) initWithParameters:(NSDictionary*)parameters
{
    self = [super init];
    if (self) {
        //initializations
        _validationCode = parameters[@"validationCode"]; // may be NSNull
        _firstName = [parameters[@"FirstName"] isKindOfClass:[NSNull class]] ? @"" 
                     : parameters[@"FirstName"];
        ...
    }
    return self;
}

注意:你可能有JSON Nulls,这使得初始化变得有些复杂。当相应的JSON值为Null时,你需要决定如何初始化属性。
你的`parameters`字典将是从服务器获取的JSON数组的第一级字典。
首先,从JSON创建一个NSArray对象,即创建JSON表示形式:
NSError* localError;
id restaurantsObjects = [NSJSONSerialization JSONObjectWithData:data 
                                                        options:0 
                                                          error:&localError];

如果这个过程没有失败,那么你的“restaurantsObjects”现在应该是一个包含餐厅作为NSDictionary对象的NSArray对象。现在,创建一个NSMutableArray将会很简单,它将被填充为Restaurant对象:
NSMutableArray* restaurants = [[NSMutableArray alloc] init];
for (NSDictionary* restaurantParameters in restaurantsObjects) {
    Restaurant* restaurant = [Restaurant alloc] initWithParameters: restaurantParameters];
    [restaurants addObject:restaurant];
}

最后,您可以在某个控制器中设置一个名为restaurants的属性:
self.restaurants = [restaurants copy];

6

您的JSON有一个字典数组... 首先将您的数据转换为NSArray。

NSError *jsonError = nil;

NSArray *jsonArray = (NSArray *)[NSJSONSerialization JSONObjectWithData:jsonData options:nil error:&jsonError];

现在您有一组JSON字典数组需要遍历。
  for (NSDictionary *dic in jsonArray){
      // Now you have dictionary get value for key
    NSString *firstName = (NSString*) [dic valueForKey:@"FirstName"];//We are casting to NSString because we know it will return a string. do this for every property...  
    }

需要注意的一点是,如果JSON中的“FirstName”为“null”,则“firstName”可能等于[NSNull null]。实际上你不知道它会返回什么(它可能是NSString,也可能是NSDictionary!),因此如果你不确定JSON的确切形式,可能需要额外小心(如果你控制服务器端,这就不太需要担心了)。 - Kitsune
在这种情况下,我们知道FirstName是字符串...所以我们像这样使用,否则我们可以使用NSObject...如果没有FirstName...它将返回nil... - Adnan Aftab
在示例 JSON 中,许多“FirstName”实际上是“null”,这意味着反序列化时为[NSNull null]。如果根本没有出现“FirstName”,则在反序列化时会得到“nil”。如果您不小心,并且 JSON 的格式与您预期/假定的不同,可能会导致崩溃(通常是无效选择器)。 - Kitsune
options 不能为 nil,请使用 0 - Raptor

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接