Как сериализовать многоуровневый JSON с помощью RestKit - PullRequest
2 голосов
/ 13 декабря 2011

Мой метод 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. Есть идеи, как мне этого добиться? Примеры остальных наборов не показывают многоуровневый JSON, поэтому они не очень помогли.

Ответы [ 4 ]

2 голосов
/ 13 декабря 2011

Похоже, что вам нужен здесь словарь, содержащий различные поля:

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"];
...

Это просто показывает, как добавить 1 контейнер с 1 триггером в этом контейнере,Но ты получил идею.Преобразуйте в соответствующие циклы, если вы хотите поместить более одного элемента в каждый массив.

Когда у вас есть эти словари (внутри массива, внутри словаря, внутри массива, внутри словаря ...), вызатем есть объект, который можно сериализовать в JSON чисто.

0 голосов
/ 28 июня 2012

Просто простой ярлык над прошлым ответом Флавиу.Если вы хотите отправить созданный словарь в качестве содержимого запроса JSON, просто используйте следующую команду:

[[RKObjectManager sharedManager] loadObjectsAtResourcePath:resourcePath usingBlock:^(RKObjectLoader *loader) {
    ...
    [loader setBody:topDictionary forMIMEType:RKMIMETypeJSON];
    ...
}];

Дополнительную информацию можно найти в заголовочном файле RKRequest (RKRequest.h).

- (void)setBody:(NSDictionary *)body forMIMEType:(NSString *)MIMEType;

Всего наилучшего

0 голосов
/ 25 апреля 2012

Тим абсолютно прав насчет того, как создавать вложенные словари. Вот как взять все это и сделать с ним 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];
}];
0 голосов
/ 29 декабря 2011

Возможно, вы захотите проверить мою реализацию для сериализации и десериализации JSON для NSObjects и наоборот. - https://github.com/QBurst/KVCObjectSerializer

...