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

时间:2017-05-17 16:12:45

标签: objective-c json xcode

我是Apple的JSON和Objective-c语言的新手。我只是想做一些练习和事情

与yandex.ru翻译api

我试过这个网址

  

https://translate.yandex.net/api/v1.5/tr.json/translate?key=trnsl.1.1.20170517T154730Z.927d87b76de60242.7a92e4612778a4838d40ab192df5297d2a1af4ed&text=Hello&lang=ar

正在将(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”   )

1 个答案:

答案 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;