Json Array to Obj 属性 在 iOS 上使用 Mantle 的转换

Json Array to Obj Property conversion using Mantle on iOS

我目前正在尝试简化我的 Obj-C 模型,但似乎 json 数据使它比我想象的要复杂一些。我无法将数组数据转换为一些布尔值。

据我所知,不可能使用框架 JSONKeyPathsByPropertyKey 来定义密钥是这样的: @"gsRightIPServerStart"、@"rights.name['RIGHT_IP_SERVERSTART'].granted" 或至少可以访问所用 class 中的序列化词典,例如。我的 FNPServer class.

这是我必须使用的 JSON 响应的一部分:

...,
isowner": false,
    "rights": 
    [

    {

        "name": "RIGHT_IP_SERVERSTART",
        "granted": true

    },
    {

        "name": "RIGHT_IP_SERVERREMOVE",
        "granted": true

    },
    {

        "name": "RIGHT_IP_SWITCHCONFIGMODE",
        "granted": true

    },

        {
            "name": "RIGHT_IP_SERVERCREATE",
            "granted": true
        }

    ]}

这是一个简单的数组,可以很容易地表示为布尔值。在这种情况下,一些 NSNumbers (CoreData):

@interface FNPServer : MTLModel <MTLJSONSerializing>
...
@property (nonatomic, strong) NSNumber * gsRightIPServerStart;
@property (nonatomic, strong) NSNumber * gsRightIPServerStop;
@property (nonatomic, strong) NSNumber * gsRightIPServerRestart;
@property (nonatomic, strong) NSNumber * gsRightIPServerModify;
@end

在生成此对象以自行处理转换时或之后,我找不到获取源字典的解决方案。

我不想让几个不同的 classes 并检查 属性 以生成一个包含完整对象的数组来回答一个简单的是或否问题。它应该在没有 "help from outside" 的情况下工作,否则我必须检查一堆请求是否存在数据。

谢谢

在您的情况下,您不能直接提供 JSONKeyPathsByPropertyKey 所需的密钥。但是您可以将 'rights' 设置为需要 'rights' 数组中的值的属性的 JSON 键路径。然后在 FNPServer 中编写自定义 'propertyNameJSONTransformer' 方法。

这是一个例子,我认为 'responseDictionary' 包含 'rights' 键。

[MTLJSONAdapter modelOfClass:FNPServer.class fromJSONDictionary:responseDictionary error:&error];

+ (NSDictionary *)JSONKeyPathsByPropertyKey {
    return @{ 
             @"gsRightIPServerStart" : @"rights",
             ...
             };
}

+ (NSValueTransformer *)gsRightIPServerStartJSONTransformer {
    return [MTLValueTransformer transformerUsingForwardBlock:^id(NSArray *rights, BOOL *success, NSError *__autoreleasing *error) {

        // here you have the 'rights' as an array
        // you can get the right value for gsRightIPServerStart within 'rights'
        // then return it by converting to an NSNumber
    }];
}