Objective c 用json问题解析阿拉伯语文本

Objective c 用json问题解析阿拉伯语文本,objective-c,json,xcode,Objective C,Json,Xcode,我不熟悉苹果公司的JSON和Objective-c语言。我只是想做些练习之类的 使用yandex.ru翻译api 我试过这个网址 这是从英语到阿拉伯语的翻译。。还好吗 在我的Xcode项目中,我尝试了以下代码 使事情顺利进行 NSString *jsonString = [NSString stringWithFormat:@"https://translate.yandex.net/api/v1.5/tr.json/translate?key=trnsl.1.1.20170517T1547

我不熟悉苹果公司的JSON和Objective-c语言。我只是想做些练习之类的

使用yandex.ru翻译api

我试过这个网址

这是从英语到阿拉伯语的翻译。。还好吗

在我的Xcode项目中,我尝试了以下代码 使事情顺利进行

 NSString *jsonString = [NSString stringWithFormat:@"https://translate.yandex.net/api/v1.5/tr.json/translate?key=trnsl.1.1.20170517T154730Z.927d87b76de60242.7a92e4612778a4838d40ab192df5297d2a1af4ed&text=Hello&lang=ar"];
jsonString = [jsonString stringByReplacingOccurrencesOfString:@" " withString:@"%20"];
NSURL *url=[NSURL URLWithString:jsonString];
NSData *data=[NSData dataWithContentsOfURL:url];
NSError *error=nil;
//NSLog(@"%@",dictionary);

NSArray* dictionary = [NSJSONSerialization JSONObjectWithData:data
                                             options:kNilOptions
                                               error:&error];


NSLog(@"Your JSON Object: %@ Or Error is: %@", [dictionary valueForKey:@"text"], error);
NSString*string = [NSString stringWithFormat:@"%@",[dictionary valueForKey:@"text"]];
在这里之前,一切都很好。。但是它在日志上返回了一个错误的值 而不是它的

您的JSON对象:( “\U0645\U0631\U062d\U0628\U0627” )


该值是正确的。它是一个与
NSLog
结合使用的对象(一个数组),它生成显示Unicode标记的输出

首先,JSON对象是一个字典而不是一个数组,Objective-C编译器非常有礼貌,现在不抱怨

NSDictionary *dictionary = [NSJSONSerialization JSONObjectWithData:data ...
其次,切勿使用
valueForKey
从字典中获取单个对象,请使用密钥订阅

NSLog(@"Your JSON Object: %@ Or Error is: %@", dictionary[@"text"], error);
但是,key
text
的值是一个数组。要获取结果字符串,请获取数组中的第一项,您应该检查是否没有错误,以及数组是否为空,以避免超出范围的崩溃

if (error == nil) {
    NSArray *result = dictionary[@"text"];
    if (result.count > 0) {
        NSString *string = result[0];
    }
}
现在,当您将
字符串
指定给标签或文本视图时,您将获得预期的
字符串


PS:代码的另外两个改进:

  • 如果没有格式参数,则不需要
    stringWithFormat

    NSString *jsonString = @"https://translate.yandex.net/api/v1.5/tr.json/translate?key=trnsl.1.1.20170517T154730Z.927d87b76de60242.7a92e4612778a4838d40ab192df5297d2a1af4ed&text=Hello&lang=ar";
    
  • 要转义无效字符,请使用
    nsurlpomponents
    ,它能够以智能方式进行转义:

    NSURLComponents *components = [NSURLComponents componentsWithString:jsonString];
    NSURL *url = components.URL;
    

该值是正确的。它是一个与
NSLog
结合使用的对象(一个数组),它生成显示Unicode标记的输出

首先,JSON对象是一个字典而不是一个数组,Objective-C编译器非常有礼貌,现在不抱怨

NSDictionary *dictionary = [NSJSONSerialization JSONObjectWithData:data ...
其次,切勿使用
valueForKey
从字典中获取单个对象,请使用密钥订阅

NSLog(@"Your JSON Object: %@ Or Error is: %@", dictionary[@"text"], error);
但是,key
text
的值是一个数组。要获取结果字符串,请获取数组中的第一项,您应该检查是否没有错误,以及数组是否为空,以避免超出范围的崩溃

if (error == nil) {
    NSArray *result = dictionary[@"text"];
    if (result.count > 0) {
        NSString *string = result[0];
    }
}
现在,当您将
字符串
指定给标签或文本视图时,您将获得预期的
字符串


PS:代码的另外两个改进:

  • 如果没有格式参数,则不需要
    stringWithFormat

    NSString *jsonString = @"https://translate.yandex.net/api/v1.5/tr.json/translate?key=trnsl.1.1.20170517T154730Z.927d87b76de60242.7a92e4612778a4838d40ab192df5297d2a1af4ed&text=Hello&lang=ar";
    
  • 要转义无效字符,请使用
    nsurlpomponents
    ,它能够以智能方式进行转义:

    NSURLComponents *components = [NSURLComponents componentsWithString:jsonString];
    NSURL *url = components.URL;