1

我已经通读了与 TouchJSON 序列化相关的问题和答案,但仍然无法正常工作。

我使用示例数据创建了一个 NSDictionary,并使用 JSONTouch 序列化程序将 NSDictionary 转换为 JSON。但是,当我记录 NSData 对象“theJSONData”时,结果是这样的:

<7b223131 31353535 34343434 223a2250 ... 65227d>

此外,当我将这个“theJSONData”数据发送到 Web 服务(期待 JSON)时,这就是我得到的结果:

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

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

2011-07-31 18:48:46.805 路灯 [7169:207] 错误:错误域=kJSONScannerErrorDomain 代码=-201 “无法扫描数组。数组不是由 '[' 字符开始的。” UserInfo=0x4d51ab0 {snippet=!HERE>!?xml version="1.0" , location=0, NSLocalizedDescription=无法扫描数组。数组不是由 '[' 字符开始的。,字符=0,行=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);
4

3 回答 3

1

感谢大家的帮助。我最终使用 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);
于 2011-08-06T21:49:03.130 回答
0

一方面,您在 NSDictionary 中反转了对象和键。

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

于 2011-08-01T02:26:05.760 回答
0

我在解析 goodle v3 api 响应时遇到了类似的问题。仍然无法解决我的问题,但我发现可能对您有帮助的一件事是,如果您使用的是反序列化器AsArray,那么 JSON 响应必须包含在“[”和“]”中,如果您是反序列化器AsDictionary,那么 JSON响应必须包含在“{”和“}”中。

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

我怀疑您已经知道这一点,但是在查看 Jonathan Wight 的代码之后,这是我解决自己的问题的方法,因为 Jonathan 的代码专门用于检查上述内容以解析 JSON 响应。

谢谢,

蒂姆

于 2011-08-03T01:51:03.130 回答