我在使用NSJSONSerialization从PHP服务器解析JSON时遇到问题。 JSLint说我的JSON有效,但似乎只能进入1-2级。
本质上这是我的JSON结构:
{
"products":
[{
"product-name":
{
"product-sets":
[{
"set-3":
{
"test1":"test2",
"test3":"test4"
},
"set-4":
{
"test5":"test6",
"test7":"test8"
}
}]
},
"product-name-2":
{
"product-sets":
[{
}]
}
}]
}
这是我的代码来解析它:
NSDictionary *json = [NSJSONSerialization JSONObjectWithData:responseData options:kNilOptions error:&error];
if (json) {
NSArray *products = [json objectForKey:@"products"]; // works
for (NSDictionary *pItem in products) { // works
NSLog(@"Product: %@", pItem); // works, prints the entire structure under "product-name"
NSArray *productSets = [pItem objectForKey:@"product-sets"]; // gets nil
for (NSDictionary *psItem in productSets) {
// never happens
}
}
}
我已经为此花了几个小时,但在搜索的任何地方都找不到类似的东西。我有没有意识到的限制,还是只是看不到明显的东西?
最佳答案
您错过了一个嵌套对象
NSArray *productSets = [[pItem objectForKey:@"product-name"] objectForKey:@"product-sets"];
我使用此CLI程序对其进行了测试
#import <Foundation/Foundation.h>
int main(int argc, const char * argv[])
{
@autoreleasepool {
NSString *jsonString = @"{\"products\":[{\"product-name\": {\"product-sets\": {\"set-3\":{\"test1\":\"test2\", \"test3\":\"test4\"}, \"set-4\":{\"test5\":\"test6\", \"test7\":\"test8\"} }}}, {\"product-name-2\": \"2\"}]}";
// insert code here...
NSLog(@"%@", jsonString);
NSError *error;
NSDictionary *json = [NSJSONSerialization JSONObjectWithData:[jsonString dataUsingEncoding:NSUTF8StringEncoding] options:kNilOptions error:&error];
if (json) {
NSArray *products = [json objectForKey:@"products"]; // works
for (NSDictionary *pItem in products) { // works
NSLog(@"Product: %@", pItem); // works, prints the entire structure under "product-name"
NSArray *productSets = [[pItem objectForKey:@"product-name"] objectForKey:@"product-sets"]; // gets nil
for (NSDictionary *psItem in productSets) {
NSLog(@"%@", psItem);
}
}
}
}
return 0;
}
请注意,您的json中的某些内容很奇怪:
对于每个展平的对象,键应相同。包含数字或对象的键没有多大意义。如果需要跟踪单个对象,请包含具有适当值的id密钥。
关于objective-c - NSJSONSerialization仅获得根 key ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12095200/