Iphone 如何使用RestKit序列化多级JSON
我让GET方法正常工作并正确映射返回的对象。现在我正在研究POST方法。我需要序列化一个多级JSON,特别是它有以下格式的3个级别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":
{
"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;