2013-12-23 12 views
1

我想将json字符串映射到使用特定类的匿名对象。假设我有一个国家班。我想解析一个json字符串到这个对象中而不知道它是哪个对象。所以我使用该类进行解析。将JSON字符串解析为基于iOS中的类的对象

@interface CountryModel 

@property (assign, nonatomic) int id; 
@property (strong, nonatomic) NSString* country; 

@end 

NSString* json = (fetch here JSON from Internet) ... 
CountryModel* country ; 
id obj = country ; 

obj = tojson([obj class] , json ) 

https://github.com/icanzilb/JSONModel做什么,我需要的,但我需要同样的事情,而不使用继承。我想做同样的事情,而不从JSONModel继承;

回答

1

您可以为您的自定义模型类(例如,CountryModel)定义一个实现类工厂方法的类别。一个人为的例子:

@interface CountryModel (JSONExtension) 
+ (CountryModel*) jsonExtension_modelWithJSONObject:(NSDictionary*)jsonObject error:(NSError**)error; 
@end 


@implementation CountryModel (JSONExtension) 

+ (CountryModel*) jsonExtension_modelWithJSONObject:(NSDictionary*)jsonObject error:(NSError**)error {   
    // Create an object of type Foo with the given NSDictionary object 
    CountryModel* result = [[CountryModel alloc] initWithName:jsonObject[@"name"]]; 
    if (result == nil) { 
     if (error) { 
      *error = [NSError errorWithDomain:@"CountryModel" 
             code:-100 
            userInfo:@{NSLocalizedDescriptionKey: @"Could not initialize CountryModel with JSON Object"}]; 
     } 
     return nil; 
    } 
    // "recursively" use jsonExtension_modelWithJSONObject:error: in order to initialize internal objects: 
    BarModel* bar = [BarModel jsonExtension_modelWithJSONObject:jsonObject[@"bar"] error:error]; 
    if (bar == nil) // bar is required 
    { 
     result = nil; 
     return nil; 
    } 
    result.bar = bar; 

    return result; 
} 

@end 

的JSONObject是JSON对象作为NSDictionary对象的表示。您需要先通过类工厂方法创建此表示形式,例如:

NSError* error; 
NSDictionary* jsonObject = [NSJSONSerialization JSONObjectWithData:jsonData options:0 error:&error]; 
assert([jsonObject isKindOfClass[NSDictionary class]]); 

CountryModel* model = [CountryModel jsonExtension_modelWithJSONObject:jsonObject error:&error];