问题
I'm sending JSON (initially stored in an NSDictionary) using AFNetworking. My object looks like this (taken from a doc comment):
/**
* 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
*/
and I get this on the server:
{ fileSequence: '3',
playlistSession:
{ config: { maxSegments: '4', targetDuration: '10' },
mediaSequence: '0',
meta:
{ id: 'MioeXvdiwB',
isAvailable: '0',
isFinished: '0',
shouldBeAvailable: '0',
shouldFinish: '0' },
timeElapsed: '0' } }
With characters and strings where numbers and booleans should be. Am I doing something wrong?
Here's the request (the object is stored in an 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++;
回答1:
I ended up adding a method to my NSDictionary+JSON
category called 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;
}
returns a NSString
that doesn't need to be coerced or parsed, just a simple call to JSON.parse()
in nodejs
来源:https://stackoverflow.com/questions/20136567/afnetworking-json-serialization-problems