NSJSONSerialization弄乱了NSDictionary

时间:2014-08-22 09:32:09

标签: ios ios7 nsdictionary afnetworking-2 nsjsonserialization

我在解析Web服务的json输出时遇到问题。我正在使用NSJSONSerialization将输出解析为NSDictionary。还通过子类化AFHTTPSessionManager使用AFNetworking。目前,响应序列化器是AFHTTPResponseSerializer,它返回NSData 这是我正在使用的代码:

NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:responseObject options:NSJSONReadingMutableLeaves error:&err];

非常简单。错误的对象是零,所以转换工作正常。

但是:我直接从网络服务获得的结果是:

           "address":
           {
               "address1": "Ivy House",
               "address2": "Sandy Lane",
               "city": "Rush",
               "postCode": null,
               "email": "notknown@whatever.com",
               "telephone": "18437584",
               "mobile": null,
               "smsAlert": null,
               "county": "Dublin",
               "country": "Ireland",
               "websiteAddress": "www.example.com"
           },

打印dict内容后得到的结果是:

address =     {
    address1 = "Ivy House";
    address2 = "Sandy Lane";
    city = Rush;
    country = Ireland;
    county = Dublin;
    email = "notknown@whatever.com";
    mobile = "<null>";
    postCode = "<null>";
    smsAlert = "<null>";
    telephone = 18437584;
    websiteAddress = "www.example.com";
};

问题是生成的NSDictionary没有双引号,所以将NSDictionary以plist格式保存到磁盘FAILS!

我也尝试过使用AFJSONResponseSerializer返回NSDictionary,但内容与上面相同!

这里的问题在哪里?

提前致谢。

2 个答案:

答案 0 :(得分:2)

这里的问题似乎与双引号无关。打印时,NSDictionary(以及其他Foundation对象)在不需要时会删除双引号(例如,当字符串中没有空格或特殊字符时)。

现在,阻止您将NSDictionary序列化到属性列表的可能问题是JSON中存在nulls,因此NSDictionary中存在NSData。根据{{​​3}}:

  

属性列表对象包括NSStringNSArrayNSDictionaryNSDateNSNumbernulls个对象。

而来自JSON的NSNull将被表示为NSDictionary的实例,从而使您的{{1}}成为无效的属性列表。

答案 1 :(得分:1)

NSDictionary与JSON字符串有不同的结构。因此,当您将JSON字符串解析为NSDictionary时,您不应该期望引号。

您可以保存JSON数据并在运行时再次解析它。

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *dataPath = [documentsDirectory stringByAppendingPathComponent:@"yourfilename.dat"];

 // Save it into file system
[data writeToFile:dataPath atomically:YES];