ios - 我如何使用 NSJSONSerialization 与特殊字符,如 "ñ"?

标签 ios objective-c nsjsonserialization

我正在使用 NSJSONSerialization 来解析 Google 的建议。

查询“f”返回这些建议:

["f",["facebook","flipkart","fox news","forever 21","friv","fandango","fedex","fitbit","food near me","flights"]]

解析器工作正常,但是当查询“fac”有特殊字符如“ñ”时:

["fac",["facebook","facebook search","fac","facebook app","facebook lite","facebook login","facebook logo","facebook messenger","facetime","facebook en español"]]

它抛出一个异常:

Error Domain=NSCocoaErrorDomain Code=3840 "Unable to convert data to string around character 139." UserInfo={NSDebugDescription=Unable to convert data to string around character 139.}

有什么想法吗?我尝试了所有不同的阅读选项,但没有一个有效。

#pragma mark -

- (void)request:(NSString *)text
{
    NSMutableArray *items = [[NSMutableArray alloc] init];

    NSString *query = [text stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]];

    NSString *languageCode = [[NSLocale preferredLanguages] firstObject];

    if (!languageCode) {

        languageCode = @"en";
    }

    NSString *URLString = [NSString stringWithFormat:@"http://suggestqueries.google.com/complete/search?q=%@&client=firefox&hl=%@", query, languageCode];

    NSError *downloadError = nil;

    NSData *JSONData = [NSData dataWithContentsOfURL:[NSURL URLWithString:URLString] options:0 error:&downloadError];

    if (!downloadError && JSONData) {

        NSError *parseError = nil;

        id object = [NSJSONSerialization JSONObjectWithData:JSONData options:NSJSONReadingMutableContainers error:&parseError];

        if (!parseError && object) {

            if ([object isKindOfClass:[NSArray class]]) {

                NSArray *objects = (NSArray *)object;

                NSArray *texts = [objects objectAtIndex:1];

                for (NSString *text in texts) {

                    SNGoogleItem *item = [[SNGoogleItem alloc] initWithText:text];

                    [items addObject:item];
                }

                [_delegate google:self didRespondWithItems:items];
            }
            else {

                [_delegate google:self didRespondWithItems:items];
            }
        }
        else {

            [_delegate google:self didRespondWithItems:items];
        }
    }
    else {

        [_delegate google:self didRespondWithItems:items];
    }
}

最佳答案

JSONSerialization 支持 JSON 规范中的所有编码,说 Apple documentation .

您没有提供有关数据编码方案的太多信息,但我猜您使用的是 nonLossyASCII 或类似的东西,JSONSerialization 不支持它。

以下是我将数据与 JSON 相互转换的方法:

let rawString = "[[\"facebook en español\"]]"
// if I use String.Encoding.nonLossyASCII below, I get the error you are getting
let data = rawString.data(using: String.Encoding.utf8)
let dict = try! JSONSerialization.jsonObject(with: data!)
let convertedData = try! JSONSerialization.data(withJSONObject: dict)
let convertedString = String(data: convertedData, encoding: String.Encoding.utf8)!
// now convertedString contains "ñ" character

关于ios - 我如何使用 NSJSONSerialization 与特殊字符,如 "ñ"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43681624/

相关文章:

ios - NSJSONSerialization 在 iOS 中为 MapQuest JSON 返回 null

ios - 如何在没有设备的情况下为App ID添加钥匙串(keychain)共享功能?

objective-c - 使用 des cbc 模式 obj-c 加密/解密字符串

objective-c - NSURLCache 使用什么缓存算法?

objective-c - 处理 NSJSONSerialization 中的 Foundation 对象时发生内存泄漏

json - 将下面提到的 Json 字符串转换为字典

ios - FCM iOS 设备 token 在 aws sns 推送通知中不起作用

ios - 找不到子项目(框架)的模块

ios - 如何使两个 Collection View 出现在同一个 View Controller 上?

ios - 如何在导航 Controller 内的特定 View Controller 上隐藏导航栏