Dies funktioniert genauso wie erwartet:
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]);
Hier ist die Ausgabe der Konsole:
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
Beachten Sie, dass, wenn wir die folgende Zeile in dem obigen Code anhängen ..
NSLog(@"%@", [[dict objectForKey:@"objs"] superclass]);
... wir erhalten die folgende Ausgabe auf der Konsole:
2012-03-28 18:09:53.770 ExampleRunner[42830:707] NSMutableArray
... nur für den Fall es nicht klar war, dass __NSArrayM
eine private Unterklasse von NSMutableArray
ist, was beweist, dass der Code des OP tat in der Tat Arbeiten wie erwartet (außer für seine NSLog
Aussage).
EDIT
Oh, und übrigens, die folgende Codezeile ...
NSLog(@"%d", [[dict objectForKey:@"objs"] isKindOfClass:[NSMutableArray class]]);
... Ergebnisse werden in der folgenden Ausgabe der Konsole:
2012-03-28 18:19:19.721 ExampleRunner[42886:707] 1
BEARBEITEN (auf geänderte Frage antworten)
Interessant ... sieht aus wie ein Käfer. Angesichts der folgenden Code:
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);
Hier ist die Ausgabe der Konsole:
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
So leere Arrays und auf diese Weise erstellt Wörterbücher scheinen nicht wie erwartet zu verhalten.
Sind Sie sicher, dass sie nicht als NSMutableDictionary ausgegeben werden? – Zalykr
Was ist die Ausgabe, wenn Sie 'po [[listOfObjects Klasse] Superklasse]' in der Debug-Konsole ausführen? – warrenm
Ich kann dieses Problem unter Mac OS X 10.7 bestätigen - nur leere Arrays scheinen betroffen zu sein. Es scheint in 10.8 behoben zu sein. – blutfink