我是Apple的JSON和Objective-c语言的新手。我只是想做一些练习和事情
与yandex.ru翻译api
我试过这个网址
正在将(HELLO)从英语翻译成阿拉伯语..仍然很好
在我的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” )
答案 0 :(得分:2)
价值是正确的。它是一个对象 - 一个数组 - 与NSLog
结合使用,产生显示Unicode标记的输出。
首先,JSON对象是一个字典而不是一个数组,Objective-C编译器是如此礼貌,不要抱怨此刻。
NSDictionary *dictionary = [NSJSONSerialization JSONObjectWithData:data ...
其次从不使用valueForKey
从字典中获取单个对象,使用密钥订阅
NSLog(@"Your JSON Object: %@ Or Error is: %@", dictionary[@"text"], error);
但是,键text
的值是一个数组。要获取结果字符串,请获取数组中的第一项,然后检查是否没有错误以及数组是否为空以避免超出范围的崩溃。
if (error == nil) {
NSArray *result = dictionary[@"text"];
if (result.count > 0) {
NSString *string = result[0];
}
}
现在,当您将string
分配到标签或文字视图时,您将获得预期的مرحبا
。
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";
要转义无效字符,请使用能够以智能方式执行此操作的NSURLComponents
:
NSURLComponents *components = [NSURLComponents componentsWithString:jsonString];
NSURL *url = components.URL;