带有德语变音符号的 NSJSONSerialization 异常

Posted

技术标签:

【中文标题】带有德语变音符号的 NSJSONSerialization 异常【英文标题】:NSJSONSerialization Exception with german umlaut 【发布时间】:2013-12-09 07:56:57 【问题描述】:

我尝试将我的对象转换为 json 字符串,没有变音符号它工作正常,但是当我输入带有“ä”或“ü”的文本时,我收到此错误:

ExceptionType = "System.ArgumentException";
Message = "Ein ung\U00fcltiges Objekt wurde \U00fcbergeben. Erwartet wurde \":\" oder \"\". 

这是我的代码:

-(Buchungsergebnis*)sendeBuchung:(NSString *)Buchung vomWebservice:(NSString *)WebServiceURL

//Erstellt einen Request

NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:[NSURL URLWithString:WebServiceURL]];

[request setHTTPMethod: @"POST"];
[request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];

NSData *reqData = [NSData dataWithBytes:[Buchung UTF8String] length:[Buchung length]];
[request setHTTPBody:reqData];

NSURLResponse *response =[[NSURLResponse alloc]init];
NSError *error;
//Führt den Befehl aus
NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];
if (data ==nil)

    NSLog(@"Login Error: %@",error);
    return false;

NSMutableDictionary *dic = [[NSMutableDictionary alloc]init ];
dic = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:&error];
NSLog(@"%@",dic);

NSMutableDictionary *result = [[NSMutableDictionary alloc]init];
result = [dic objectForKey:@"d"] ;

Buchungsergebnis *ergebnis = [[Buchungsergebnis alloc]init];
ergebnis.result =[[result objectForKey:@"result"]boolValue];
ergebnis.message =[result objectForKey:@"message"];


return ergebnis;

这是json:

"thema":"用变音符号测试 \n\nÖffne die tür","personenanzahl":"4","vondatum":"17.12.2013 09:00","veranstalteremail":"asjgdl@dgs. de","bisdatum":"17.12.2013 10:30","dienstleistungen":[],"teilnehmer":[],"veranstaltertelefon":"","veranstalter":"blagojevic domenik","bestuhlungsid": "377","benutzername":"dbl"

我怎样才能防止这个错误?

【问题讨论】:

【参考方案1】:

您的 JSON 是有效的(可以在 http://jsonlint.com 上进行测试)。

但这是有问题的:

NSData *reqData = [NSData dataWithBytes:[Buchung UTF8String] length:[Buchung length]];

因为[Buchung length]返回字符串中(Unicode)字符的个数, 这与非 ASCII 字符(如变音符号)的 UTF-8 字节数 的数量不同。 更好用

NSData *reqData = [Buchung dataUsingEncoding:NSUTF8StringEncoding];

或者使用 NSJSONSerialization 创建 JSON,它会为您提供一个 NSData 对象 而不是字符串。

您可能还必须明确设置 HTTP 内容长度,我不确定是否这样 是必要的:

[request setValue:[NSString stringWithFormat:@"%d", [reqData length]] forHTTPHeaderField:@"Content-Length"];

【讨论】:

【参考方案2】:

尝试使用: [NSJSONSerialization JSONObjectWithData:数据选项:NSJSONReadingMutableLeaves 错误:&error]; (使用 NSJSONReadingMutableLeaves 代替 kNilOptions)

我将它用于包含中文、西班牙文、印地语的数据。对我来说效果很好。

【讨论】:

以上是关于带有德语变音符号的 NSJSONSerialization 异常的主要内容,如果未能解决你的问题,请参考以下文章

带有德语变音符号的 iOS 上的 FacebookDisplayName

带有变音符号的 xcodebuild 目标名称

CakePHP 2.1:德语变音符号的 Sluggable 行为

Python2 / Windows7:打开包含德语变音符号的文件名

使用 utf8_general_ci 排序规则和 utf8 字符集服务器的德语变音符号的搜索结果区分大小写

UTF-8 解码变音符号偶尔会失败