Проблемы сериализации AFNetworking JSON

Я отправляю JSON (изначально хранящийся в NSDictionary) с помощью AFNetworking. Мой объект выглядит так (взято из комментария документа):

/**
 *  Sends a create request to the API server
 *  Success will be a dictionary containing:
 *
 *   playlistSession: {
 *       "mediaSegments": {},
 *       "mediaSequence": 0,
 *       "timeElapsed": 0,
 *       "config": {
 *           "maxSegments": 4,
 *           "targetDuration": 10
 *       },
 *       "meta": {
 *           "id": "test",
 *           "shouldBeAvailable": false,
 *           "isAvailable": false,
 *           "shouldFinish": false,
 *           "isFinished": false
 *       }
 *   }
 *
 *  And should be appended to the sessionData dictionary
 */

и я получаю это на сервере:

{ fileSequence: '3',
  playlistSession: 
   { config: { maxSegments: '4', targetDuration: '10' },
     mediaSequence: '0',
     meta: 
      { id: 'MioeXvdiwB',
        isAvailable: '0',
        isFinished: '0',
        shouldBeAvailable: '0',
        shouldFinish: '0' },
     timeElapsed: '0' } }

С символами и строками, где должны быть числа и логические значения. Я делаю что-то неправильно?

Вот запрос (объект хранится в NSMutableDictionary):

self.sessionData[fileSequenceKey] = [NSNumber numberWithInt:fileNumber];
self.sessionData[playlistSessionKey][metaKey][shouldFinishKey] = [NSNumber numberWithBool:lastSegment];

NSString *urlString = [[NSURL URLWithString:[NSString stringWithFormat:kAppendPath, self.postPath] relativeToURL:self.manager.baseURL] absoluteString];

NSURLRequest *request = [self.manager.requestSerializer multipartFormRequestWithMethod:@"POST"
                                                                                     URLString:urlString
                                                                                    parameters:self.sessionData
                                                                     constructingBodyWithBlock:^(id<AFMultipartFormData> formData) {
                                                                         NSError *error;
                                                                         [formData appendPartWithFileURL:target name:mediaSegmentKey error:&error];
                                                                     }];

        AFHTTPRequestOperation *operation = [self.manager HTTPRequestOperationWithRequest:request
                                                                                  success:[self successBlock:lastSegment]
                                                                                  failure:[self failureBlock:lastSegment]];
        [operation setUploadProgressBlock:[self completionBlock]];

        [self.manager.operationQueue addOperation:operation];
        fileNumber++;

person HighFlyingFantasy    schedule 22.11.2013    source источник
comment
0 ложны. Ненулевое значение верно.   -  person JeffRegan    schedule 04.12.2013
comment
Я понимаю, но это не работало на стороне сервера, а синтаксический анализ JSON был медленным. Я отправляю, как я решил это сейчас   -  person HighFlyingFantasy    schedule 04.12.2013


Ответы (1)


В итоге я добавил в свою категорию NSDictionary+JSON метод под названием JSONString.

/**
 *  Serializes a JSON string to be sent over the network
 *
 *  @return The serialized playlist session JSON string
 */
- (NSString*)JSONString {
    NSError *error;
    NSData *serializedData = [NSJSONSerialization dataWithJSONObject:self options:NSJSONWritingPrettyPrinted error:&error];

    NSString *JSONString = [[NSString alloc] initWithData:serializedData encoding:NSUTF8StringEncoding];

    return JSONString;
}

возвращает NSString, который не нужно принуждать или анализировать, просто вызов JSON.parse() в nodejs

person HighFlyingFantasy    schedule 04.12.2013
comment
Возможно, вы захотите заменить NSJSONWritingPrettyPrinted на 0, но это личное предпочтение. - person JeffRegan; 04.12.2013
comment
Вы упускаете некоторые функции AFNetworking, которые могут оказаться полезными в будущем. Вы можете просто переключиться с AFHTTPRequestOperation на AFJSONRequestOperation и получить это встроенное. - person Aaron Brager; 04.12.2013
comment
У меня это на AFJSONRequestOperation, и то, что выводится, непригодно для использования без синтаксического анализа. - person HighFlyingFantasy; 04.12.2013
comment
Я тоже вижу эту проблему. Использование AFJSONRequestOperation не приводит к появлению на сервере чисел без кавычек. @HighFlyingFantasy, похоже, вы нашли обходной путь, который требует настройки на стороне сервера, а не решения на клиенте. Это правильно? - person Chris Prince; 25.05.2016
comment
В итоге мне пришлось внести изменения как на стороне клиента, так и на стороне сервера. См. stackoverflow.com/questions/37449472/ - person Chris Prince; 07.06.2016