我知道,JSON解析问题一再被问到,但我仍然找不到任何答案。
我一直在尝试使用NSJSONSerialization来阅读和解析文本JSON文件,但无济于事
我尝试过使用NSString中的相同JSON数据,但确实有效
这是代码:
NSError *error;
NSString *jsonString1 = [NSString stringWithContentsOfFile:jsonFilePath
encoding:NSUTF8StringEncoding
error:&error];
NSData *jsonData1 = [jsonString1 dataUsingEncoding:NSUTF8StringEncoding];
NSDictionary *jsonObject1 = [NSJSONSerialization JSONObjectWithData:jsonData1
options:0
error:&error];
NSString *jsonString2 = @"{\"key\":\"value\"}";
NSData *jsonData2 = [jsonString2 dataUsingEncoding:NSUTF8StringEncoding];
NSDictionary *jsonObject2 = [NSJSONSerialization JSONObjectWithData:jsonData2
options:0
error:&error];
- 文本文件包含一行:{“key”:“value”}
- jsonString1 = @“{”key“:”value“}”
- jsonString2 = @“{\”key \“:\”value \“}”
- jsonData1的大小为23字节
- jsonData2的大小为15个字节
- jsonObject1为零,我收到错误代码3840
- jsonObject2是一个有效的字典
似乎问题在于读取文件,因为NSStrings和NSDatas有所不同,但我在这里做错了什么以及如何修复它?
答案 0 :(得分:1)
您的文件很可能包含一些触发失败的不可打印字符(例如\ 0)。打印错误消息将告诉您第一个无效字符出现在什么位置。
例如,尝试打印"{\"key\":\u{0000}\"value\"}"
并且您似乎获得了有效的JSON,但解码失败。
答案 1 :(得分:0)
我总是在使用NSUTF8StringEncoding执行任何操作时检查返回值,如果为nil,则尝试NSASCIIStringEncoding:
NSString *jsonString = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];
if (jsonString == nil) {
jsonString = [[NSString alloc] initWithData:jsonData encoding:NSASCIIStringEncoding];
}
return jsonString;