【问题标题】:Serialize a custom object with JSONModel使用 JSONModel 序列化自定义对象
【发布时间】:2016-01-27 15:38:21
【问题描述】:

我尝试使用适用于 iOS 的 JSONModel 框架从我的自定义对象中创建一个 JSON 文件。我得到错误:

-[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

不能递归地创建 JSON 字符串吗?当我调用 toJSONString 方法时,我得到了这些错误。

【问题讨论】:

    标签: ios objective-c json serialization jsonmodel


    【解决方案1】:
    @property (nonatomic, strong) NSArray<RegisterBuyerData*> *fields;
    

    应该是

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

    所以去掉多余的*,然后再试一次。

    编辑:

    哦,我明白了。似乎您尚未将要级联的类型声明为协议。所以请执行以下操作

    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
    

    【讨论】:

    • 我试过了,但 Xcode 不想构建然后:类型参数 'RegisterBuyerData' 必须是一个指针(需要一个 '*')
    • 谢谢,这就是问题所在。我添加了@protocol RegisterBuyerData @end;并将数组类型更改为 NSArray 没有指针。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-26
    • 1970-01-01
    相关资源
    最近更新 更多