2012-04-20 3 views
3

У меня есть задание, которое требует, чтобы я поместил строку как объект json, и перед отправкой объекта я должен поместить этот json-объект в заголовок http. Это мой код:Отправка строки как объекта JSON

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    NSString *nid = @""; 
    NSString *vocab = @""; 
    NSString *inturl = @"testoverview"; 
    NSString *mail = @"[email protected]"; 
    NSString *md5pw = @"4d57e7ef1b7c3f431aca424764e9d786"; 

    NSDictionary *jsonDictionary = [NSDictionary dictionaryWithObjectsAndKeys: 
            nid, @"nid", 
            vocab, @"vocab", 
            inturl, @"inturl", 
            mail, @"mail", 
            md5pw, @"md5pw",nil]; 


    NSString *json = @"{nid:"",vocab:"",inturl:testoverview, mail:[email protected], md5pw:4d57e7ef1b7c3f431aca424764e9d786}"; 


    NSError *error; 



    NSString *url = @"http://udv.taenk.dk/chh/drupal-taenk/services/mobile"; 


    NSData *data = [json dataUsingEncoding:NSUTF8StringEncoding allowLossyConversion:YES]; 

    NSData *jsonData = [NSJSONSerialization dataWithJSONObject:jsonDictionary options:NSJSONWritingPrettyPrinted error:&error]; 


    NSString *jsonString = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding]; 
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:url] cachePolicy:NSURLCacheStorageAllowed timeoutInterval:30.0]; 

    NSURLConnection *connction = [[NSURLConnection alloc] initWithRequest:request delegate:self]; 
    FSRemoteExecutor *remote = [[FSRemoteExecutor alloc] init]; 
    [remote execute:url andHandler:[FSProductTestHandler alloc] JSONString:jsonString JSONData:jsonData Connection:connction]; 
    [remote connection:connction didReceiveData:jsonData]; 
    [remote connectionFinishedLoading:connction]; 

Моя проблема заключается в том, что я не могу использовать jsonDictionary с объектами и отправить его, Потому что формат строки, что сервис должен получить это:

«{» нидь ":" "," vocab ":" "," inturl ":" testoverview "," mail ":" "," md5pw ":" "}"

Словарь будет вставлять = в строку, и это будет не дайте мне ответа от службы.

Я хочу отправить строку (JSON в коде), как dataWithJSONObject: JSO, любит это:

NSData *jsonData = [NSJSONSerialization dataWithJSONObject:json options:NSJSONWritingPrettyPrinted error:&error]; 

, но я получаю сообщение об ошибке satating это:

Нагрузочного приложение из-за неперехваченное исключение 'NSInvalidArgumentException', причина: '* + [NSJSONSerialization dataWithJSONObject: опции: ошибка]: Неверный тип верхнего уровня в формате JSON записи'

может кто-нибудь поможет мне в этом?

ответ

12

Но зачем использовать использование NSJSONSerialization? (NSString *json = @"{nid:"",vocab:"",inturl:testoverview, mail:[email protected], md5pw:4d57e7ef1b7c3f431aca424764e9d786}";). Тогда вам не нужно снова запускать NSJSONSerialization.

Просто сделайте NSData из своего *json (NSString), а затем отправьте его на сервер.

Сделайте NSData так:

NSData *jsonPayload = [json dataUsingEncoding:NSUTF8StringEncoding]; 
+0

Спасибо, можете ли вы рассказать мне, как получить данные ответа службы и распечатать их? – Lahib

4

Во-первых, ваша строка json не содержат кавычки символов, которые вы думаете, что он делает. Вы должны «избежать» цитаты в строке с обратной косой чертой, чтобы она не прерывала строку. Ваша линия:

NSString *json = @"{nid:"",vocab:"",inturl:testoverview, mail:[email protected], md5pw:4d57e7ef1b7c3f431aca424764e9d786}"; 

в настоящее время анализируется так:

NSString *json = @"{nid:" 
       ",vocab:" 
       ",inturl:testoverview, mail:[email protected], md5pw:4d57e7ef1b7c3f431aca424764e9d786}"; 

То есть, это три строки в кавычках в последовательности. Компилятор объединяет смежные строковые литералы. Таким образом, эффект таков:

NSString *json = @"{nid:,vocab:,inturl:testoverview, mail:[email protected], md5pw:4d57e7ef1b7c3f431aca424764e9d786}"; 

не содержит встроенных символов кавычек.

То, что вы хотели написать было:

NSString *json = @"{nid:\"\",vocab:\"\",inturl:testoverview, mail:[email protected], md5pw:4d57e7ef1b7c3f431aca424764e9d786}"; 

Вы можете показать вывод:

NSData *jsonData = [NSJSONSerialization dataWithJSONObject:jsonDictionary options:NSJSONWritingPrettyPrinted error:&error]; 

Я не вижу, где вы получите символ «=».


Update:

Этот код (модифицированный из Вашего вопроса):

NSString *nid = @""; 
NSString *vocab = @""; 
NSString *inturl = @"testoverview"; 
NSString *mail = @"[email protected]"; 
NSString *md5pw = @"4d57e7ef1b7c3f431aca424764e9d786"; 

NSDictionary *jsonDictionary = [NSDictionary dictionaryWithObjectsAndKeys: 
           nid, @"nid", 
           vocab, @"vocab", 
           inturl, @"inturl", 
           mail, @"mail", 
           md5pw, @"md5pw",nil]; 

NSError *error; 
NSData *jsonData = [NSJSONSerialization dataWithJSONObject:jsonDictionary options:NSJSONWritingPrettyPrinted error:&error]; 
NSString *resultAsString = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding]; 
NSLog(@"jsonData as string:\n%@", resultAsString); 

дает этот вывод:

jsonData as string: 
{ 
    "md5pw" : "4d57e7ef1b7c3f431aca424764e9d786", 
    "nid" : "", 
    "inturl" : "testoverview", 
    "mail" : "[email protected]", 
    "vocab" : "" 
} 

если вы используете 0 вместо NSJSONWritingPrettyPrinted, это дает :

jsonData as string: 
{"md5pw":"4d57e7ef1b7c3f431aca424764e9d786","nid":"","inturl":"testoverview","mail":"[email protected]","vocab":""} 
+0

Когда я печатаю содержимое jsonDictionary, он будет печатать объект и ключ с помощью «=» между ними. Это не содержание jsonData, у которого есть «=» внутри. – Lahib

+0

Итак? Что вам небезразлично, как печатает «NSDictionary»? Это не повлияет ни на что, о чем вы должны заботиться. –

+0

Строка должна быть отформатирована таким образом, служба не примет ее, если она не отформатирована, как я написал. – Lahib

Смежные вопросы