Разбор NSStrings для обеспечения правильно сформированной строки JSON в XCode - PullRequest
5 голосов
/ 10 февраля 2010

Я читаю строковые данные из PLIST, который я использую для создания строки JSON (случайно для использования в Facebook Connect).

NSString *eventLink = [eventDictionary objectForKey:EVENT_FIND_OUT_MORE_KEY];
NSString *eventLinkEscaped = [eventLink stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
NSString *eventName = [eventDictionary objectForKey:EVENT_NAME_KEY];
NSString *eventDescription = [eventDictionary objectForKey:@"Description"];
NSString *eventImageAddress = [eventDictionary valueForKey:@"Image URL"];
if ([eventImageAddress length] == 0)
{
    eventImageAddress = NO_EVENT_IMAGE_URL;
}
// Publish a story to the feed using the feed dialog
FBStreamDialog *facebookStreamDialog = [[[FBStreamDialog alloc] init] autorelease];
    facebookStreamDialog.delegate = self;
    facebookStreamDialog.userMessagePrompt = @"Publish to Facebook";
    facebookStreamDialog.attachment =[NSString stringWithFormat: @"{\"name\":\"%@\",\"href\":\"%@\",\"description\":\"%@\",\"media\":[{\"type\":\"image\",\"src\":\"%@\",\"href\":\"%@\"}]}", eventName, eventLinkEscaped, eventDescription, eventImageAddress, eventLinkEscaped];
[facebookStreamDialog show];

Все это работает хорошо, но в некоторых описаниях событий (4 из 150) текст, отображаемый в диалоговом окне, пуст. Я нашел очевидных кандидатов, т. Е. Описание содержит символ «например» или символ авторского права. Мой вопрос заключается в том, существует ли простой вызов метода, например stringByAddingPercentEscapesUsingEncoding: NSUTF8StringEncoding, который гарантирует, что любые хитрые символы будут экранированы или проигнорированы?

Заранее спасибо,

Dave

1 Ответ

2 голосов
/ 16 февраля 2010

Я не думаю, что есть простой способ избежать проблемных строк. Если вам нужна поддержка JSON где-либо еще в вашем коде, рассмотрите возможность использования одной из существующих сред синтаксического анализа / генератора JSON, таких как yajl-objc или SBJSON . Любой из них позволит вам построить свой ответ как объекты Foundation (NSArray / NSDictionary), а затем вызвать один метод для генерации соответствующего JSON. Ваш код будет более чистым, и вы получите преимущество в том, что обе эти платформы хорошо протестированы.

Если вам просто нужно сгенерировать этот бит JSON, вам лучше всего вручную пройтись по входным строкам, заменив символы потенциальной проблемы на соответствующие экранированные версии. Это не так плохо, как вы думаете. Взгляните на источник для SBJsonWriter

...