将MTLModel子类的嵌套数据结构序列化为JSON

时间:2013-03-11 21:34:18

标签: ios objective-c json macos github-mantle

我遇到了来自Github的Mantle framework的问题。我想做以下

@interface ClassA : MTLModel <MTLJSONSerializing>
@property(strong, non-atomic) ClassB *instanceOfB; 
@end

@implementation ClassA
+ (NSDictionary *)JSONKeyPathsByPropertyKey {
    return [super.JSONKeyPathsByPropertyKey mtl_dictionaryByAddingEntriesFromDictionary:@{
            @"instanceOfB": @"user"
            }];
}

@interface ClassB : MTLModel <MTLJSONSerializing>
@property(strong, non-atomic) NSString *name; 
@end

@implementation ClassB
+ (NSDictionary *)JSONKeyPathsByPropertyKey {
    return [super.JSONKeyPathsByPropertyKey mtl_dictionaryByAddingEntriesFromDictionary:@{
            @"name": @"user_name"
            }];
}

编辑

当我使用ClassA[NSJSONSerialization dataWithJSONObject:[MTLJSONAdaptor JSONDictionaryFromModel:instanceOfA]的实例序列化为JSON时,我希望获得以下JSON对象,其中选定的B属性嵌套在JSON密钥user下:

{ user: {
           user_name: <value of class B's name property>
        }
}

我认为必须走下与NSCoding类似的对象关系树。我想知道这种行为是否已经实现,我只是无法弄清楚如何使用它,或者我是否必须自己编写代码。

除了自述文件之外,我也无法找到更多关于地幔框架的文档。

2 个答案:

答案 0 :(得分:1)

我最终向classA添加了自定义userJSONTransformer

+ (NSValueTransformer *)userJSONTransformer
{
    return [MTLValueTransformer reversibleTransformerWithBlock:^id(ClassB *b){
        return @{ @"user_name": b.name,
                };
    }];
}

现在生成了正确的嵌套数据结构。

答案 1 :(得分:0)

您可以使用NSValueTransformer reverseTransformedValue方法。

+ (NSValueTransformer *)userJSONTransformer
{
    return [MTLValueTransformer reversibleTransformerWithBlock:^id(ClassB *b){
        return [[NSValueTransformer mtl_JSONDictionaryTransformerWithModelClass:[ClassB class]] reverseTransformedValue:b]
    }];
}