我创建了一个返回JSON的Web服务,我认为。返回的数据如下所示:
{"invoice":{"id":44,"number":42,"amount":1139.99,"checkoutStarted":true,"checkoutCompleted":true}}
对我来说,这看起来像是有效的JSON。
在iOS5中使用本机JSON序列化程序,我将数据捕获为NSDictionary。
NSError *error;
NSDictionary *json = [NSJSONSerialization JSONObjectWithData:[request responseData] options:kNilOptions error:&error];
NSLog(@"json count: %i, key: %@, value: %@", [json count], [json allKeys], [json allValues]);
日志的输出是:
json count: 1, key: (
invoice
), value: (
{
amount = "1139.99";
checkoutCompleted = 1;
checkoutStarted = 1;
id = 44;
number = 42;
}
)
因此,在我看来,JSON数据有一个NSString密钥“invoice”,其值为NSArray ({amount = ..., check...})
因此,我将值转换为NSArray:
NSArray *latestInvoice = [json objectForKey:@"invoice"];
但是,当单步执行时,它表示latestInvoice不是CFArray。如果我打印出数组中的值:
for (id data in latestInvoice) {
NSLog(@"data is %@", data);
}
结果是:
data is id
data is checkoutStarted
data is ..
我不明白为什么它只返回“id”而不是“id = 44”。如果我将JSON数据设置为NSDictionary,我知道密钥是NSString但是值是多少?是NSArray还是其他什么?
这是我读过的教程: http://www.raywenderlich.com/5492/working-with-json-in-ios-5
编辑:从答案来看,似乎NSDictionary * json的“价值”是另一个NSDictionary。我认为这是NSArray或NSString这是错误的。换句话说,[K,V]代表NSDictionary * json = [@“invoice”,NSDictionary]
答案 0 :(得分:5)
问题在于:
NSArray *latestInvoice = [json objectForKey:@"invoice"];
实际上,它应该是:
NSDictionary *latestInvoice = [json objectForKey:@"invoice"];
...因为你所拥有的是字典而不是数组。
答案 1 :(得分:2)
Wow,原生JSON解析器,甚至没有注意到它被引入。
NSArray *latestInvoice = [json objectForKey:@"invoice"];
这实际上是一个NSDictionary,而不是NSArray。阵列没有钥匙。你似乎有能力来自这里。
答案 2 :(得分:1)
在这里,我认为你必须像这样使用nsdictionary
NSData* data = [NSData dataWithContentsOfURL: jsonURL];
NSDictionary *office = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:nil];
NSDictionary *invoice = [office objectForKey:@"invoice"];