này chỉ hoạt động như mong đợi:
NSString *s = @"{ \"objs\": [ \"a\", \"b\" ] }";
NSData *d = [NSData dataWithBytes:[s UTF8String] length:[s length]];
id dict = [NSJSONSerialization JSONObjectWithData:d options:NSJSONReadingMutableContainers error:NULL];
NSLog(@"%@", dict);
[[dict objectForKey:@"objs"] addObject:@"c"];
NSLog(@"%@", dict);
NSLog(@"%@", [[dict objectForKey:@"objs"] class]);
Dưới đây là giao diện điều khiển đầu ra:
2012-03-28 13:49:46.224 ExampleRunner[42526:707] {
objs = (
a,
b
);
}
2012-03-28 13:49:46.225 ExampleRunner[42526:707] {
objs = (
a,
b,
c
);
}
2012-03-28 13:49:46.225 ExampleRunner[42526:707] __NSArrayM
EDIT
Lưu ý rằng nếu chúng ta thêm dòng sau vào mã ở trên .. .
NSLog(@"%@", [[dict objectForKey:@"objs"] superclass]);
.210
... chúng tôi nhận được đầu ra sau trên console:
2012-03-28 18:09:53.770 ExampleRunner[42830:707] NSMutableArray
... chỉ trong trường hợp nó không phải là rõ ràng rằng __NSArrayM
là một lớp con riêng của NSMutableArray
, do đó chứng minh rằng mã của OP đã thực sự làm việc như mong đợi (ngoại trừ tuyên bố NSLog
).
EDIT
Oh, và bằng cách này, các dòng mã sau đây ...
NSLog(@"%d", [[dict objectForKey:@"objs"] isKindOfClass:[NSMutableArray class]]);
... kết quả trong giao diện điều khiển đầu ra sau đây:
2012-03-28 18:19:19.721 ExampleRunner[42886:707] 1
EDIT (trả lời câu hỏi đã thay đổi)
Thú vị ... trông giống như một lỗi. Căn cứ vào đoạn mã sau:
NSData *dictData2 = [@"{ \"foo\": \"bar\" }" dataUsingEncoding:NSUTF8StringEncoding];
id dict2 = [NSJSONSerialization JSONObjectWithData:dictData2 options:NSJSONReadingMutableContainers error:NULL];
NSLog(@"%@", [dict2 class]);
NSLog(@"%@", [dict2 superclass]);
NSLog(@"%d", [dict2 isKindOfClass:[NSMutableDictionary class]]);
// This works...
[dict2 setObject:@"quux" forKey:@"baz"];
NSLog(@"%@", dict2);
NSData *dictData = [@"{}" dataUsingEncoding:NSUTF8StringEncoding];
id emptyDict = [NSJSONSerialization JSONObjectWithData:dictData options:NSJSONReadingMutableContainers error:NULL];
NSLog(@"%@", [emptyDict class]);
NSLog(@"%@", [emptyDict superclass]);
NSLog(@"%d", [emptyDict isKindOfClass:[NSMutableDictionary class]]);
//...but this fails:
[emptyDict setObject:@"quux" forKey:@"baz"];
NSLog(@"%@", emptyDict);
Dưới đây là giao diện điều khiển đầu ra:
2012-03-29 09:40:52.781 ExampleRunner[43816:707] NSMutableDictionary
2012-03-29 09:40:52.782 ExampleRunner[43816:707] 1
2012-03-29 09:40:52.782 ExampleRunner[43816:707] __NSCFDictionary
2012-03-29 09:40:52.782 ExampleRunner[43816:707] NSMutableDictionary
2012-03-29 09:40:52.783 ExampleRunner[43816:707] 1
2012-03-29 09:40:52.783 ExampleRunner[43816:707] {
baz = quux;
foo = bar;
}
2012-03-29 09:40:52.784 ExampleRunner[43816:707] __NSCFDictionary
2012-03-29 09:40:52.784 ExampleRunner[43816:707] NSMutableDictionary
2012-03-29 09:40:52.784 ExampleRunner[43816:707] 1
2012-03-29 09:40:52.785 ExampleRunner[43816:707] NSException: -[__NSCFDictionary setObject:forKey:]: mutating method sent to immutable object
mảng Vì vậy, sản phẩm nào và từ điển được tạo ra theo cách này dường như không hoạt động như mong đợi.
Bạn có chắc chắn rằng họ không sắp ra mắt như NSMutableDictionary? – Zalykr
Đầu ra khi bạn chạy 'po [[listOfObjects class] superclass]' trong bảng điều khiển gỡ lỗi là gì? – warrenm
Tôi có thể xác nhận vấn đề này trên Mac OS X 10.7 - chỉ các mảng trống dường như bị ảnh hưởng. Nó dường như được sửa trong 10.8. – blutfink