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

Posted

技术标签:

【中文标题】将 JSON 字符串解析为对象数组 Objective C【英文标题】:parse JSON string into array of objects Objective C 【发布时间】:2013-11-13 13:07:31 【问题描述】:

我有一个从 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

什么是最好的方法,对不起,问题可能来自基础知识,但我是目标 C 的新手

感谢您的宝贵时间。

【问题讨论】:

【参考方案1】:

我建议为您的 Restaurant 类实现一个 init 方法。

-(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 Null 的事实使您的初始化有点复杂。当对应的 JSON 值为 Null 时,您需要决定如何初始化属性。

您的 parameters 字典将是您从服务器获得的 JSON 数组中的第一级字典。

首先,创建一个 JSON 表示,即来自 JSON 的 NSArray 对象:

NSError* localError;
id restaurantsObjects = [NSJSONSerialization JSONObjectWithData:data 
                                                        options:0 
                                                          error:&localError];

如果这没有失败,您的 restaurantsObjects 现在应该是一个 NSArray 对象,其中包含餐厅为 NSDictionarys。

现在,可以直接创建一个 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];

【讨论】:

【参考方案2】:

您的 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 将如何形成(如果你控制服务器端,这不是一个问题)。 在这种情况下,我们知道 FirstName 是字符串...所以我们像这样使用,否则我们可以使用 NSObject...如果没有 FirstName...它将返回 nil.. . 示例 JSON 中的许多 FirstName 实际上是 null,这意味着在反序列化时 [NSNull null]。如果FirstName 根本没有出现,反序列化时你会得到nil。如果您不小心,并且 JSON 的格式与您预期/假设的不同,您最终可能会崩溃(可能是无效的选择器)。 options 不能是nil,请改用0

以上是关于将 JSON 字符串解析为对象数组 Objective C的主要内容,如果未能解决你的问题,请参考以下文章

在我们将其解析为 JSON 之前,Snowflake 如何转义对象数组字符串中的所有特殊字符?

使用gson解析怎么将json字符串解析为数组

将 JSON 查询字符串解析为 JSON 对象

使用 JSON.net 将 JSON 解析为匿名对象 []

js解析与序列化json数据(一)json.stringify()的基本用法

php如何将json对象转字符串