JSON解析内容,结果不可读,如“\U5b9d\U4e30”
JSON parse content, result is unreadable, such as ""\U5b9d\U4e30""
- (IBAction)updating:(id)sender {
NSString *string = [NSString stringWithFormat:@"https://api.heweather.com/x3/weather?cityid=CN101180503&key=MY_API_ID"];
NSURL *url = [NSURL URLWithString:string];
NSURLRequest *request = [NSURLRequest requestWithURL:url];
AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request];
operation.responseSerializer = [AFJSONResponseSerializer serializer];
[operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {
//ResponseObject is dictionary
NSMutableDictionary *dictionary = responseObject;
NSArray *array = dictionary[@"HeWeather data service 3.0"];
NSDictionary *dicBasic = [array valueForKey:@"basic"];
NSData *city = [dicBasic valueForKey:@"city"];
NSLog(@"%@", city);
NSString *latitude = [dicBasic valueForKey:@"lat"];
NSLog(@"%@", latitude);
} failure:^(AFHTTPRequestOperation * _Nonnull operation, NSError * _Nonnull error) {
NSLog(@"Nothing ");
}];
当我运行段码时,除了城市名,其他都是正常的,
我想我需要从 JSON 文件中解码城市名称,因为城市名称是中文的。
这是一个例子:
2016-07-23 15:36:55.825 weatherDemo[2865:1189546] ( "\U5b9d\U4e30" ) 2016-07-23 15:36:55.825 weatherDemo[2865:1189546] ( "33.908000"
我该如何处理?
调查问题后。我想通了,都是response对象的数据结构。
试试下面的代码来得到你想要的:
NSDictionary *responseDic = [[(NSDictionary *)responseObject objectForKey:@"HeWeather data service 3.0"] firstObject];
NSDictionary *basicDic = [responseDic objectForKey:@"basic"];
NSString *cityStr = [basicDic objectForKey:@"city"];
NSLog(@"%@", cityStr);
首先,我敢打赌
dictionary[@"HeWeather data service 3.0"]
是不是数组。然后您正在使用 valueForKey。 valueForKey 的任何使用都表明您不知道自己在做什么。 valueForKey 不关心它是什么类型的对象。我假设编译器告诉你不能使用
array [@"basic"]
您没有修复明显的错误,而是找到了最糟糕的解决方法。
你的实际问题根本不是问题。 JSON 可以很好地处理汉字。但是 NSLog 会像您看到的那样输出它们。这是 NSLog(它是一个调试工具)的问题。您的字符串中的数据绝对没问题。将它们放入标签或文本字段中,它们将被绘制得很好。
PS。任何时候你得到的响应不是你所期望的,你的应用程序都会崩溃。在不检查您获得的项目是否确实是您期望的类型的情况下解析 JSON 是绝对不负责任的。
- (IBAction)updating:(id)sender {
NSString *string = [NSString stringWithFormat:@"https://api.heweather.com/x3/weather?cityid=CN101180503&key=MY_API_ID"];
NSURL *url = [NSURL URLWithString:string];
NSURLRequest *request = [NSURLRequest requestWithURL:url];
AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request];
operation.responseSerializer = [AFJSONResponseSerializer serializer];
[operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {
//ResponseObject is dictionary
NSMutableDictionary *dictionary = responseObject;
NSArray *array = dictionary[@"HeWeather data service 3.0"];
NSDictionary *dicBasic = [array valueForKey:@"basic"];
NSData *city = [dicBasic valueForKey:@"city"];
NSLog(@"%@", city);
NSString *latitude = [dicBasic valueForKey:@"lat"];
NSLog(@"%@", latitude);
} failure:^(AFHTTPRequestOperation * _Nonnull operation, NSError * _Nonnull error) {
NSLog(@"Nothing ");
}];
当我运行段码时,除了城市名,其他都是正常的,
我想我需要从 JSON 文件中解码城市名称,因为城市名称是中文的。
这是一个例子:
2016-07-23 15:36:55.825 weatherDemo[2865:1189546] ( "\U5b9d\U4e30" ) 2016-07-23 15:36:55.825 weatherDemo[2865:1189546] ( "33.908000"
我该如何处理?
调查问题后。我想通了,都是response对象的数据结构。
试试下面的代码来得到你想要的:
NSDictionary *responseDic = [[(NSDictionary *)responseObject objectForKey:@"HeWeather data service 3.0"] firstObject];
NSDictionary *basicDic = [responseDic objectForKey:@"basic"];
NSString *cityStr = [basicDic objectForKey:@"city"];
NSLog(@"%@", cityStr);
首先,我敢打赌
dictionary[@"HeWeather data service 3.0"]
是不是数组。然后您正在使用 valueForKey。 valueForKey 的任何使用都表明您不知道自己在做什么。 valueForKey 不关心它是什么类型的对象。我假设编译器告诉你不能使用
array [@"basic"]
您没有修复明显的错误,而是找到了最糟糕的解决方法。
你的实际问题根本不是问题。 JSON 可以很好地处理汉字。但是 NSLog 会像您看到的那样输出它们。这是 NSLog(它是一个调试工具)的问题。您的字符串中的数据绝对没问题。将它们放入标签或文本字段中,它们将被绘制得很好。
PS。任何时候你得到的响应不是你所期望的,你的应用程序都会崩溃。在不检查您获得的项目是否确实是您期望的类型的情况下解析 JSON 是绝对不负责任的。