Search code examples
iosobjective-cjsonserializationjsonmodel

Serialize a custom object with JSONModel


I try to create a JSON file out of my custom Object with the JSONModel framework for iOS. I get the Error:

-[JSONModel.m:1077] EXCEPTION: Invalid type in JSON write (RegisterBuyerDataOption)
-[JSONModel.m:1077] EXCEPTION: Invalid type in JSON write (RegisterBuyerDataOption)
-[JSONModel.m:1077] EXCEPTION: Invalid type in JSON write (RegisterBuyerData)

registerBuyerData.h

@interface RegisterBuyerData : JSONModel


@property (nonatomic, strong) NSString              *buyerDataID;
@property (nonatomic        ) RegisterBuyerDataType  type;
@property (nonatomic, strong) NSString<Optional>              *title;
@property (nonatomic        ) BOOL                   required;
@property (nonatomic, strong) NSString              *value;
@property (nonatomic)         NSNumber<Optional>              *price;
@property (nonatomic)         NSNumber<Optional>              *availability;

@property (nonatomic, strong) NSArray<RegisterBuyerData*>              *fields;  //array of more RegisterBuyerData
@property (nonatomic, strong) NSArray<RegisterBuyerDataOption*>        *options; //key,value array for dropDown

@property (nonatomic, strong) NSArray                                  *parentValue;
@property (nonatomic, strong) NSArray<RegisterBuyerData*>              *children; //array of more RegisterBuyerData but only for special selected value of an options field

- (BOOL) isAvailableForUser;

@end

registerBuyerData.m

@implementation RegisterBuyerData

- (BOOL) isAvailableForUser{

    return (!_availability || [_availability integerValue] > 0 );
}


+(JSONKeyMapper*)keyMapper
{
    return [[JSONKeyMapper alloc] initWithDictionary:@{@"id": @"buyerDataID",@"value": @"value"}];
}

@end

RegisterBuyerDataOption.h

@interface RegisterBuyerDataOption : JSONModel

@property (nonatomic, strong) NSString *key;
@property (nonatomic, strong) NSString *value;
@property (nonatomic, strong) NSNumber *price;
@property (nonatomic, strong) NSNumber *availability;

- (BOOL) isAvailableForUser;

@end

Is it not possible to create a JSON String recursively? When I call the toJSONString method I get these Errors.


Solution

  • @property (nonatomic, strong) NSArray<RegisterBuyerData*> *fields;
    

    should be

    @property (nonatomic, strong) NSArray<RegisterBuyerData> *fields;
    

    So get rid of the extra * and try again.

    Edit:

    Oh, I see. It seems like you haven't declared the types you want to cascade as protocols. So do the following

    RegisterBuyerDataOption.h

    @protocol RegisterBuyerDataOption @end;
    
    @interface RegisterBuyerDataOption : JSONModel
    
    @property (nonatomic, strong) NSString *key;
    @property (nonatomic, strong) NSString *value;
    @property (nonatomic, strong) NSNumber *price;
    @property (nonatomic, strong) NSNumber *availability;
    
    - (BOOL) isAvailableForUser;
    
    @end
    

    registerBuyerData.h

    @protocol RegisterBuyerData @end;
    
    @interface RegisterBuyerData : JSONModel
    
    
    @property (nonatomic, strong) NSString              *buyerDataID;
    @property (nonatomic        ) RegisterBuyerDataType  type;
    @property (nonatomic, strong) NSString<Optional>              *title;
    @property (nonatomic        ) BOOL                   required;
    @property (nonatomic, strong) NSString              *value;
    @property (nonatomic)         NSNumber<Optional>              *price;
    @property (nonatomic)         NSNumber<Optional>              *availability;
    
    @property (nonatomic, strong) NSArray<RegisterBuyerData*>              *fields;  //array of more RegisterBuyerData
    @property (nonatomic, strong) NSArray<RegisterBuyerDataOption*>        *options; //key,value array for dropDown
    
    @property (nonatomic, strong) NSArray                                  *parentValue;
    @property (nonatomic, strong) NSArray<RegisterBuyerData*>              *children; //array of more RegisterBuyerData but only for special selected value of an options field
    
    - (BOOL) isAvailableForUser;
    
    @end