这是我的JSON。我想解析,以便当我将它推入我的数组时,我的JSON中的第一个对象首先出现。但现在它似乎随机解析?有时按顺序排列:1,5,3,2,4有时是2,3,1,5,4。有谁知道我能做些什么来让他们按正确的顺序?
{
"1":
[
{
"film":
[
{
"title":"film1",
"description": "desc1"
},
{
"title": "film2",
"description": "desc2"
}
],
"tv":
[
{
"title": "tv",
"description": "desc1"
},
{
"title": "tv2",
"description": "desc2"
}
]
}
],
"2":
[
{
"category2":
[
{
"title":"item1",
"description": "desc1"
},
{
"title": "item2",
"description": "desc2"
}
]
}
],
"3":
[
{
"category2":
[
{
"title":"item1",
"description": "desc1"
},
{
"title": "item2",
"description": "desc2"
}
]
}
],
"4":
[
{
"category2":
[
{
"title":"item1",
"description": "desc1"
},
{
"title": "item2",
"description": "desc2"
}
]
}
],
"5":
[
{
"category2":
[
{
"title":"item1",
"description": "desc1"
},
{
"title": "item2",
"description": "desc2"
}
]
}
]
}
解析代码:
NSString *filePath = [[NSBundle mainBundle] pathForResource:@"test" ofType:@"json"];
NSString *contents = [NSString stringWithContentsOfFile: filePath encoding: NSUTF8StringEncoding error: nil];
SBJsonParser *jsonParser = [[SBJsonParser alloc] init];
NSMutableDictionary *json = [jsonParser objectWithString: contents];
tabs = [[NSMutableArray alloc] init];
jsonParser = nil;
for (NSString *tab in json)
{
Tab *tabObj = [[Tab alloc] init];
tabObj.title = tab;
NSLog(@"%@", tabObj.title);
NSDictionary *categoryDict = [[json valueForKey: tabObj.title] objectAtIndex: 0];
for (NSString *key in categoryDict)
{
Category *catObj = [[Category alloc] init];
catObj.name = key;
NSArray *items = [categoryDict objectForKey:key];
// you should add error checking to make sure this is actually an NSArray
for (NSDictionary *dict in items)
{
Item *item = [[Item alloc] init];
item.title = [dict objectForKey: @"title"];
item.desc = [dict objectForKey: @"description"];
[catObj.items addObject: item];
NSLog(@"----%@", catObj.items);
}
[tabObj.categories addObject: catObj];
NSLog(@"%@", tabObj.categories);
}
[tabs addObject: tabObj];
}
答案 0 :(得分:1)
NSMutableDictionary
根本没有订购。当您请求密钥时,它们将以非确定性顺序返回给您。 JSON文本具有顺序这一事实与此相关,因为在数据在字典中返回时,元数据在解析期间丢失。
按照“正确”的顺序获取它们取决于正确的顺序。如果您可以从字典中获取密钥并对其进行排序,那么只需使用compare:
即可。如果您确实需要原始JSON中的订单,那么您将需要深入了解解析操作并使用SBJSON类提供的委派选项添加额外信息。
答案 1 :(得分:0)
如果您控制输入源,您可以保留有序列表并控制输入:
-(NSArray *)orderedPartsList {
return @[@"tubes", @"dynamic", @"tracks", @"passives",@"actives",@"walls", @"curvedWalls", @"glassCovers", @"enemies"];
}
NSString *key = [self orderedPartsList][indexPath.section];
id the orderedObject = [someCurrentDictionary objectForKey:key]
如果它来自其他人的网络服务器,那么你没有太多选择,因为词典(哈希)是无序的。