TOUCHJSON Сериализация из NSDictionary - PullRequest
1 голос
/ 01 августа 2011

Я прочитал вопросы и ответы, связанные с сериализацией TouchJSON, и до сих пор не могу заставить ее работать.

Я создаю NSDictionary с образцами данных и использовал сериализатор JSONTouch для преобразования NSDictionary в JSON.Однако, когда я регистрирую объект NSData 'theJSONData', он дает мне следующее:

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

Дополнительно,когда я отправляю эти данные 'theJSONData' в веб-службу (которая ожидает JSON), я получаю следующее сообщение:

2011-07-31 18: 48: 46.572 Уличные фонари [7169: 207] Ошибка сериализации:(ноль)

2011-07-31 18: 48: 46.804 Уличные фонари [7169: 207] returnData: (ноль)

2011-07-31 18: 48: 46.805 Уличные фонари [7169: 207] Ошибка: Ошибка Domain = kJSONScannerErrorDomain Code = -201 "Не удалось просканировать массив. Массив не запущен символом '['." UserInfo = 0x4d51ab0 {snippet =! HERE> !? версия xml= "1.0", location = 0, NSLocalizedDescription = Не удалось отсканировать массив.Массив не начинается с символа '[', символ = 0, строка = 0}

Что я делаю не так?Нужно ли преобразовывать объект JSON NSData 'theJSONData' в другой тип, прежде чем я отправлю его в веб-службу?Я пропускаю еще один шаг?

// 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);

Ответы [ 3 ]

1 голос
/ 07 августа 2011

Спасибо всем за помощь.В итоге я использовал 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);
0 голосов
/ 03 августа 2011

У меня похожие проблемы при разборе ответа на API Goodle v3.Все еще не ближе к решению моей проблемы, но я нашел одну вещь, которая может оказаться полезной для вас, если вы используете deserializerAsArray, тогда ответ JSON должен быть заключен в "[" и "]", а если вы deserializerAsDictionary, то JSONответ должен быть заключен в "{" и "}".

Поскольку JSON-ответ google v3 api имеет формат "{" "}", мне нужно использовать метод deserialiserAsDictionary.

Я подозреваю, что вы уже это знаете, но после просмотра кода Джонатана Уайтаэто насколько я пришел к решению моей собственной проблемы, поскольку код Джонатана специфичен для проверки вышеупомянутого при разборе ответа JSON.

Спасибо,

Тим

0 голосов
/ 01 августа 2011

Во-первых, ваши объекты и ключи поменялись местами в NSDictionary.

Я недостаточно знаю о TouchJSON, чтобы помочь с этой частью кода.

...