基于iOS中的类将JSON字符串解析为对象

基于iOS中的类将JSON字符串解析为对象,ios,json,class,generics,jsonmodel,Ios,Json,Class,Generics,Jsonmodel,我想使用特定类将json字符串映射到匿名对象。假设我有一节乡村课。我想将json字符串解析到这个对象中,而不知道它是哪个对象。所以我使用这个类进行解析 @interface CountryModel @property (assign, nonatomic) int id; @property (strong, nonatomic) NSString* country; @end NSString* json = (fetch here JSON from Internet) ...

我想使用特定类将json字符串映射到匿名对象。假设我有一节乡村课。我想将json字符串解析到这个对象中,而不知道它是哪个对象。所以我使用这个类进行解析

@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  )

做我需要的,但我需要相同的东西而不使用继承。我希望在不继承JSONModel的情况下做同样的事情

您可以为自定义模型类(例如,
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];