Iphone 如何使用RestKit序列化多级JSON

Iphone 如何使用RestKit序列化多级JSON,iphone,json,restkit,Iphone,Json,Restkit,我让GET方法正常工作并正确映射返回的对象。现在我正在研究POST方法。我需要序列化一个多级JSON,特别是它有以下格式的3个级别 { "name": "Test", "version": "1", "iconId": 1, "runFrequency": 5, "lastActionSummary": "Yesterday, 9:30am", "description": "Test", "id":

我让GET方法正常工作并正确映射返回的对象。现在我正在研究POST方法。我需要序列化一个多级JSON,特别是它有以下格式的3个级别

{
      "name": "Test", 
      "version": "1", 
      "iconId": 1, 
      "runFrequency": 5, 
      "lastActionSummary": "Yesterday, 9:30am", 
      "description": "Test", 
      "id": 1, 
      "containers": [
            {
                  "id": 1, 
                  "triggers": [
                        {
                              "@class": "someClass", 
                              "intValue": 90, 
                              "operator": "equal", 
                              "type": "Ttest"
                        }
                  ]
            }
      ]
}

我试着像对服务器的响应进行对象映射一样进行映射,但由于容器从未添加到JSON中,所以失败了。有什么办法可以做到这一点吗?restkit示例没有显示多级JSON,因此它们没有起到很大的作用。

这里似乎需要一个包含各种字段的字典:

NSMutableDictionary *topDictionary = [[NSMutableDictionary alloc] init];
[topDictionary setObject:@"Test" forKey:@"name"];
[topDictionary setObject:@"1" forKey:@"version"];
...
然后,您有一个容器数组,每个数组项中都有一个字典:

NSMutableArray *containers = [[NSMutableArray alloc] init];
[topDictionary setObject:containers forKey:@"containers"];
NSMutableArray *arrayItem1 = [[NSMutableDictionary alloc] init];
[containers addObject:arrayItem1];
[arrayItem1 setObject:[NSNumber numberWithInteger:1] forKey:@"id"];
...
在容器下的每个字典中,都有一个触发器数组,该数组的每个项都是一个字典:

NSMutableArray *triggers = [[NSMutableArray alloc] init];
[arrayItem1 setObject:triggers forKey:@"triggers"];
NSMutableArray *trigger1 = [[NSMutableDictionary alloc] init];
[triggers addObject:trigger1];
[trigger1 setObject:@"someClass" forKey:@"@class"];
...
这只是展示了如何在容器中添加一个带有一个触发器的容器,但是您已经明白了。如果要在每个数组中放置多个项,请转换为相应的循环


一旦你有了这些字典(在数组内、字典内、数组内、字典内……),你就有了一个可以被清晰地序列化为JSON的对象。

你可能想检查我的实现,以便将JSON序列化并反序列化为NSObject,反之亦然。-

关于如何创建嵌套字典,Tim是绝对正确的。下面介绍了如何利用整个内容制作一篇JSON文章:

// create a JSON string from your NSDictionary
NSError *error; 
NSData *jsonData = [NSJSONSerialization dataWithJSONObject:topDictionary
                                                   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];
}];

只是一个简单的捷径过去弗拉维尤的答案。如果要将创建的字典作为请求正文JSON负载发送,只需使用以下命令:

[[RKObjectManager sharedManager] loadObjectsAtResourcePath:resourcePath usingBlock:^(RKObjectLoader *loader) {
    ...
    [loader setBody:topDictionary forMIMEType:RKMIMETypeJSON];
    ...
}];
查看RKRequest头文件(RKRequest.h)可以找到更多信息


尽我所能

太好了,这帮了我很大的忙。也谢谢你的明确回答
- (void)setBody:(NSDictionary *)body forMIMEType:(NSString *)MIMEType;