动态属性作为在 iOS 中使用 Restkit 发布 JSON 的关键

Posted

技术标签:

【中文标题】动态属性作为在 iOS 中使用 Restkit 发布 JSON 的关键【英文标题】:Dynamic attribute as key for posting a JSON using Restkit in iOS 【发布时间】:2012-03-08 06:44:10 【问题描述】:

我正在使用 RestKit 0.9.4。我想发布一个 JSON,它有一个需要从对象属性填充的键。 JSON如下:


    "types":[ 
        "1" : "value1"
     ,
       
         "7" : "value2"
      ]
 

我有一个对象,它有 2 个分别命名为 keytype 和 value 的 NSString 数据成员。 keytype 是具有在上面的嵌套 json 中出现的键值的变量(上面的“1”、“7”等)。 ma​​pKeyOfNestedDictionaryToAttribute 在这里可能不起作用,因为动态属性(用作键)位于最内层。 这可以使用 RestKit 发布吗?

【问题讨论】:

【参考方案1】:

这是您如何在 NSDictionary 中创建该结构,然后使用 RestKit 将其发布为 JSON。此外,响应随后会映射到模型。

// make the inner dictionaries (probably would use a for loop for this
NSDictionary *dict1 = [[NSDictionary alloc] initWithObjectsAndKeys:@"value1", @"1", nil];
NSDictionary *dict7 = [[NSDictionary alloc] initWithObjectsAndKeys:@"value2", @"7", nil];
// put them in an array
NSArray *types = [[NSArray alloc] initWithObjects:dict1, dict7, nil];
// now put the array in a dictionary
NSDictionary *finalDict = [[NSDictionary alloc] initWithObjectsAndKeys:types, @"types", nil];

// create a JSON string from your NSDictionary
NSError *error; 
NSData *jsonData = [NSJSONSerialization dataWithJSONObject:finalDict 
                                                   options:NSJSONWritingPrettyPrinted // Pass 0 if you don't care about the readability of the generated string
                                                     error:&error];
NSString *jsonString = [[NSString alloc] init];
if (!jsonData) 
    NSLog(@"Got an error: %@", error);
 else 
    jsonString = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];


// make the post using the objectManager if you want to map the response to a model
RKObjectManager* objectManager = [RKObjectManager sharedManager];  
[objectManager loadObjectsAtResourcePath:@"/api/" delegate:self block:^(RKObjectLoader* loader) 
    loader.serializationMIMEType = RKMIMETypeJSON; // We want to send this request as JSON
    loader.objectMapping = [objectManager.mappingProvider objectMappingForClass:[Plan class]];
    loader.resourcePath = @"/api/";
    loader.method = RKRequestMethodPOST;
    loader.params = [RKRequestSerialization serializationWithData:[jsonString dataUsingEncoding:NSUTF8StringEncoding] MIMEType:RKMIMETypeJSON];
];

【讨论】:

以上是关于动态属性作为在 iOS 中使用 Restkit 发布 JSON 的关键的主要内容,如果未能解决你的问题,请参考以下文章

使用 RestKit 处理多级动态嵌套属性

RestKit 0.20:restkit 对象映射使属性映射加倍

Restkit 动态属性映射

一起使用 Realm.io 和 RestKit 时的属性数据类型

Restkit 映射 - 使用嵌入式对象/关系作为标识属性

使用 RestKit 将大对象作为 JSON 发布