来自NSDictionary的TOUCHJSON序列化



我已经阅读了与TouchJSON序列化相关的问题和答案,我仍然没有让它工作。

我用样本数据创建了一个NSDictionary,并使用JSONTouch序列化器将NSDictionary转换为JSON。然而,当我记录NSData对象'theJSONData'时,它给了我这个结果:

<7b223131>

此外,当我发送这个'theJSONData'数据到web服务(这是期待JSON)这是我得到的返回:

2011-07-31 18:48:46.572街灯[7169:207]序列化错误:(null)

2011-07-31 18:48:46.804街灯[7169:207]returnData: (null)

2011-07-31 18:48:46.805 Street Lights[7169:207] Error: ErrorDomain =kJSONScannerErrorDomain Code=-201 "Could not scan array. "数组不是以'['字符开头的。 UserInfo=0x4d51ab0 {snippet=!HERE>!?xml版本="1.0",位置=0,NSLocalizedDescription=无法扫描数组。数组不是以'['字符开头的。, character=0, line=0}

我做错了什么?是否JSON NSData对象'theJSONData'需要转换为另一种类型之前,我把它发送到web服务?我还差一步吗?

// Create the dictionary
NSDictionary *outage = [[NSDictionary alloc] initWithObjectsAndKeys:
                        @"YCoord", @"12678967.543233",
                        @"XCoord", @"12678967.543233",
                        @"StreetLightID", @"666",
                        @"StreetLightCondition", @"Let's just say 'BAD'",
                        @"PhoneNumber", @"1115554444",
                        @"LastName", @"Smith",
                        @"Image",@"",
                        @"FirstName", @"Dawn",
                        @"Comments", @"Pole knocked down",
                        nil];
NSError *error = NULL;
// Serialize the data
NSData *theJSONData = [[CJSONSerializer serializer] serializeDictionary:outage error:&error];
NSLog(@"theJSONData: %@", theJSONData);
NSLog(@"Serialization Error: %@", error);
// Set up the request and send it
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL: [NSURL URLWithString: @"http://24.52.35.127:81/StreetLight/StreetlightService/CreateStreetLightOutage"]];
[request setHTTPMethod: @"POST"];
[request setHTTPBody: theJSONData];
// Deserialize the response
NSData *returnData = [ NSURLConnection sendSynchronousRequest: request returningResponse: nil error:&error];
NSString *returnString = [[NSString alloc] initWithData:returnData encoding: NSUTF8StringEncoding];
NSData *theReturnData = [returnString dataUsingEncoding:NSUTF8StringEncoding];
id theObject = [[CJSONDeserializer deserializer] deserializeAsArray:theReturnData error:&error];
NSLog(@"returnData: %@",theObject);
NSLog(@"Error: %@", error);

感谢大家的帮助。我最终使用Fiddler来跟踪需要以JSON格式发送到服务的内容,然后发现我没有正确格式化标题。以下是最终为我工作的代码。

// Create the NSDictionary
NSDictionary *outage = [[NSDictionary alloc] initWithObjectsAndKeys:
                        @"12.543233",@"YCoord", 
                        @"12.543233",@"XCoord", 
                        @"111",@"StreetLightID",
                        @"Dented pole",@"StreetLightCondition", 
                        @"1115554444",@"PhoneNumber", 
                        @"Black",@"LastName", 
                        [NSNull null],@"Image",
                        @"White",@"FirstName", 
                        @"Hit by a car",@"Comments", 
                        nil];
// Serialize the data
NSError *error = NULL;
NSData *theJSONData = [[CJSONSerializer serializer] serializeDictionary:outage error:&error];
NSLog(@"Serialization Error: %@", error);
// Change the data back to a string
NSString* theStringObject = [[NSString alloc] initWithData:theJSONData encoding:NSUTF8StringEncoding];
// Determine the length of the data
NSData *requestData = [NSData dataWithBytes: [theStringObject UTF8String] length: [theStringObject length]];
NSString* requestDataLengthString = [[NSString alloc] initWithFormat:@"%d", [requestData length]];
// Create request to send to web service
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL: [NSURL URLWithString: @"http://11.22.33.444:55/StreetLight/StreetlightService/CreateStreetLightOutage"]];
[request setHTTPMethod:@"POST"];
[request setHTTPBody:requestData];
[request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
[request setValue:requestDataLengthString forHTTPHeaderField:@"Content-Length"];
[request setTimeoutInterval:30.0];
// Deserialize the response
NSData *returnData = [ NSURLConnection sendSynchronousRequest: request returningResponse: nil error:&error];
NSString *returnString = [[NSString alloc] initWithData:returnData encoding: NSUTF8StringEncoding];
NSData *theReturnData = [returnString dataUsingEncoding:NSUTF8StringEncoding];
id theObject = [[CJSONDeserializer deserializer] deserializeAsArray:theReturnData error:&error];
NSLog(@"returnData: %@",returnString);
NSLog(@"Error: %@", error);

首先,你在NSDictionary中颠倒了对象和键。

我对TouchJSON的了解不够,无法帮助处理这部分代码

我在解析google v3 api响应时有类似的问题。仍然没有接近解决我的问题,但有一件事我发现,可能对你有帮助的是,如果你使用的是deserializerAsArray那么JSON响应必须包含在"["one_answers"]",如果你是deserializerAsDictionary那么JSON响应必须包含在"{"one_answers"}"。

由于google v3 api JSON响应是"{" "}"格式,我需要使用deserialiserAsDictionary方法。

我怀疑你已经知道了这一点,但在看了乔纳森·怀特的代码之后,这是我在解决自己的问题方面所能做到的,因为乔纳森的代码在解析JSON响应时具体检查了上述问题。

谢谢,蒂姆

最新更新