Json 到 iOS 编码错误

Posted

技术标签:

【中文标题】Json 到 iOS 编码错误【英文标题】:Json to iOS Encoding Error 【发布时间】:2014-11-06 01:50:52 【问题描述】:

问题:我无法将 JSON 文件中的数据正确解析为 NSArray。 UTF 编码未按预期工作。

我的 JSON 看起来像:

[
"Name":"Marcos","Address":"1234 Brasil Av. São Paulo - SP","Latitude":"-23.000","Longitude":"-46.70","Name":"Mario","Address":"1000 Washignton Luiz Av. Itú SP","Latitude":"-20.0000","Longitude":"-46.000"
]

我的 Objective-C 代码是:

NSError *error = nil;

NSURL *jsonUrl = [[NSURL alloc]initWithString:
    @"http://marcosdegni.com.br/teste/webservice_teste.php"];

NSString *jsonString = [NSString stringWithContentsOfURL:jsonUrl
    encoding:NSUTF8StringEncoding error:&error];

NSLog(@"jsonString: %@ , Error:%@:" ,jsonString, error); //(1)

if (!error) 
    NSError *error2 = nil;
    NSData *jsonData = [jsonString dataUsingEncoding:NSUTF8StringEncoding];

    NSArray * jsonArray = [NSJSONSerialization JSONObjectWithData:jsonData options:kNilOptions error:&error2];
    NSLog(@"\n\nArray: %@" \nError:$@, jsonArray, error2); //(2)

//(*1*) This log show the content's as they are expected: note the characters ã and ú on the address fields.

//(*2*) The logs from the array and the dictionary show this charters as it's UNIX codes:\U00e and \U00fa respectively.

【问题讨论】:

为什么要对相同的数据进行两次解码,一次是数组,一次是字典?什么不起作用? error(你错误地输入nil)报告了什么(在你纠正了那个错误之后)? 这是我获取数据的两次尝试。没有一个工作。为了清楚起见,我排除了 dic 。 nil --> 错误被替换。 Tks 所以,换句话说,没有错。扩展的 UNICODE 数据按预期显示在 NSLog 中。 不,当我记录 jsonArray 时,它仍然显示 \U00e3 而不是 ã 和 \U00fa 而不是 ú... 是的!所以是正确的。 (如果您不相信我,请在标签中显示数据。) 【参考方案1】:

你可以试试这个。你得到的id json 将是一个NSArray,你可以从那里使用它。

NSData *data = [jsonString dataUsingEncoding:NSUTF8StringEncoding];
id json = [NSJSONSerialization JSONObjectWithData:data options:0 error:nil];
NSArray * array = json;
for (NSDictionary *dict in array) 
    NSString *string = [dict objectForKey:@"Address"];
    NSLog(@"%@",string);

来自here,如果我获得键的值并记录它,而不是直接记录 NSArray,我会得到正确的结果。

【讨论】:

这不会在receivedString 上产生一个未定义的符号消息吗? 现在你只是在做和 OP 一样的事情。 是的,它会的,这是我为 JSON 库测试的字符串。我已经删除了,谢谢指出。 这个答案与 OP 的代码有何不同?您所做的只是将变量类型从NSArray 更改为id 你的方法也有效。不知何故,如果我记录所有 Dic 它不起作用,但是通过将对象记录在 dic 中它可以。 Tks

以上是关于Json 到 iOS 编码错误的主要内容,如果未能解决你的问题,请参考以下文章

核心数据 NSManagedObject 到 JSON 编码不起作用

如何在 iOS 中解析 mapquest 地理编码 JSON

编码 4 字节 UTF-8 字符 ????从 Rails 到 JSON 产生无效字符

PHP json 编码 - 格式错误的 UTF-8 字符,可能编码不正确

Python MySQL CSV 导出到 json 奇怪的编码

关于带有编码图像的帖子图像的json邮递员问题