AFNetworking JSON 序列化问题

Posted

技术标签:

【中文标题】AFNetworking JSON 序列化问题【英文标题】:AFNetworking JSON serialization problems 【发布时间】:2013-11-22 03:34:49 【问题描述】:

我正在使用 AFNetworking 发送 JSON(最初存储在 NSDictionary 中)。我的对象看起来像这样(取自文档评论):

/**
 *  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++;

【问题讨论】:

0 为假。非零为真。 我明白了,但它在服务器端不起作用,解析 JSON 很慢。我现在发布我是如何解决这个问题的 【参考方案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,只需在nodejs 中简单调用JSON.parse()

【讨论】:

可能想用 0 替换 NSJSONWritingPrettyPrinted,但这是个人喜好。 您错过了一些可能对您有所帮助的 AFNetworking 功能。你可以从 AFHTTPRequestOperation 切换到 AFJSONRequestOperation 并获得这个内置的。 我在 AFJSONRequestOperation 上有,如果不解析,输出是无法使用的 我也看到了这个问题。使用 AFJSONRequestOperation 不会导致服务器上出现不带引号的数字。 @HighFlyingFantasy,您似乎已经解决了问题,这需要调整服务器端,而不是在客户端解决它。对吗? 我最终不得不同时进行客户端和服务器端的更改。见***.com/questions/37449472/…

以上是关于AFNetworking JSON 序列化问题的主要内容,如果未能解决你的问题,请参考以下文章

使用 AFNetworking 2.5 将 JSON 序列化为 NSArray

IOS 开发 网络详解AFNetworking总结

AFNetworking 向 JSON 响应键添加引号

AFNetworking 无法序列化压缩响应(响应对象为零)

NSJSONSerialization 弄乱了结果 NSDictionary

AFNetworking 2.0 和响应序列化选项