【发布时间】:2014-05-11 21:54:08
【问题描述】:
我有一个 NSDictionary 包含几个不同的对象,其中有一个 NSArray。
数组中的元素是自定义对象的NSDictionary-表示。为简单起见,我已重命名属性并删除了其他一些属性。
首先我尝试像这样简单地序列化NSArray,只是为了看看它会是什么样子:
NSData *jsonData = [NSJSONSerialization dataWithJSONObject:myArray options:NSJSONWritingPrettyPrinted error:&writeError];
NSLog(@"%@", [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding]);
结果看起来像这样,这是我所期望的:
[
{
"someProperty" : "Value 1"
},
{
"someProperty" : "Value 2"
}
]
但是,当我将(未编码的)数组添加到 NSDictionary 并对其进行序列化时,数组看起来不同:
NSMutableArray *myArray = [NSMutableArray array];
[myArray addObject:[object1 dictionaryRepresentation]]; // dictionaryRepresentation returns a NSDictionary
[myArray addObject:[object2 dictionaryRepresentation]];
NSMutableDictionary *dictionary = [NSMutableDictionary dictionary];
[dictionary setObject:myArray forKey:@"myArray"];
NSData *jsonData = [NSJSONSerialization dataWithJSONObject:dictionary options:NSJSONWritingPrettyPrinted error:&writeError];
NSLog(@"%@", [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding]);
现在结果如下所示:
{
myArray = (
{
"someProperty" : "Value 1"
},
{
"someProperty" : "Value 2"
}
);
}
我没有得到"myArray" : [...],而是得到myArray = (...);,这不是正确的JSON表示。
在将NSArray 添加到字典时,使用 JSON 表示的正确方法是什么?
【问题讨论】:
-
对你的“Now”结果的最佳(虽然不完美)解释是,你从第一个字典中获取了编码的 JSON,转换为 NSString,然后将其添加到第二个字典中。这不是应该做的。您应该将第一个字典本身而不是它的 JSON 表示添加到第二个字典。一切都应该同时进行 JSON 编码,只需一个操作。
-
(如果您向我们展示进行编码的代码,包括产生上述输出的 NSLog 语句,将会有所帮助。)
-
我相信我现在理解了这种困惑。看起来我正在获取
NSArray的编码表示(来自第一个代码sn-p)并将其添加到我的NSDictionary(在第二个代码sn-p 中)。事实上,这两个代码 sn-ps 根本没有一起使用。正如我在问题中解释的那样,我只使用第一个 sn-p 中的代码来测试NSArray的序列化会是什么样子。我现在提供了额外的代码行来解释我实际上对数组做了什么。对于不明确之处,我深表歉意。 -
重点是您上面的最终“JSON”列表不是有效的 JSON,也不是在 NSLogging 上看到的表示有效 JSON 的 NSDictionary。注意“myArray”没有被引用,后面跟着
=,与字典的NSLog一致,而“someProperty”被引用,后面跟着:,与JSON一致。你没有向我们展示真实数据。 -
(一个 JSON "object" 包含引用的键值,并使用
:将键与值分隔。NSDictionary 的 NSLog 仅在键值包含非字母字符时引用它们,并将键与值分隔带有=。此外,JSON“对象”被[]“括起来”,而字典的NSLog用()括起来。)
标签: objective-c json nsarray nsdictionary nsjsonserialization