我有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表示。
将{J}表示添加到字典中时,使用NSArray
的JSON表示的正确方法是什么?
答案 0 :(得分:4)
在第一种情况下,您将打印出JSON编码操作的结果。
在第二种情况下,您是通过NSLog
直接打印字典而不是其JSON表示。
<强>更新强>
要查看此信息,请使用此日志记录功能代替NSLog
:
void logThisObject(id obj)
{
if(obj == nil) {
NSLog(@"logObject: nil");
} else {
NSString *className = NSStringFromClass([obj class]);
NSLog(@"logObject: an %@: %@", className, obj);
}
}
更新2:
void test_it()
{
NSArray *myArray = @[@"bla", @"foo"];
NSError *writeError = nil;
NSMutableDictionary *dictionary = [NSMutableDictionary dictionary];
[dictionary setObject:myArray forKey:@"myArray"];
NSData *jsonData = [NSJSONSerialization dataWithJSONObject:dictionary options:NSJSONWritingPrettyPrinted error:&writeError];
if(writeError) {
NSLog(@"an error happened: %@", writeError);
}
logThisObject([[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding]);
}
这会输出正确的JSON字符串:
logObject: an __NSCFString: {
"myArray" : [
"bla",
"foo"
]
}