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
}];
}
我目前正在尝试简化我的 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
}];
}