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
AFNetworking 无法序列化压缩响应(响应对象为零)