Iphone 接收来自服务器的相同JSON响应
如何对这个json进行排序。下面的json在浏览器中输出Iphone 接收来自服务器的相同JSON响应,iphone,ios,Iphone,Ios,如何对这个json进行排序。下面的json在浏览器中输出 { event: { July: [ { createdSeatMap: "yes", status: "1", completed: "1", eventPayment: "0", } ], Aug: [ { createdSeatMap: "yes", status: "1", completed: "1", eventPayment: "0", } ], Sept: [ ], Oct: [ ], Nov: [ ], Dec: [ {
{
event: {
July: [
{
createdSeatMap: "yes",
status: "1",
completed: "1",
eventPayment: "0",
}
],
Aug: [
{
createdSeatMap: "yes",
status: "1",
completed: "1",
eventPayment: "0",
}
],
Sept: [ ],
Oct: [ ],
Nov: [ ],
Dec: [
{
createdSeatMap: "yes",
status: "1",
completed: "1",
eventPayment: "0",
stamp: "1386019800"
},
{
createdSeatMap: "yes",
status: "1",
completed: "1",
eventPayment: "0",
stamp: "1387921620"
}
],
Jan: [ ],
Feb: [ ],
Mar: [ ],
Apr: [ ],
May: [ ],
June: [ ]
}
}
获取时,下面是控制台
Apr = (
);
Aug = (
{
createdSeatMap: "yes",
status: "1",
completed: "1",
eventPayment: "0",
}
);
Dec = (
{
createdSeatMap: "yes",
status: "1",
completed: "1",
eventPayment: "0",
stamp: "1386019800"
},
{
createdSeatMap: "yes",
status: "1",
completed: "1",
eventPayment: "0",
stamp: "1387921620"
}
);
Feb = (
);
Jan = (
);
July = (
{
createdSeatMap: "yes",
status: "1",
completed: "1",
eventPayment: "0",
}
);
June = (
);
Mar = (
);
May = (
);
Nov = (
);
Oct = (
);
Sept = (
);
下面是我正在使用的代码
NSMutableArray *dictAllValues = [[NSMutableArray alloc]init];
NSMutableDictionary *getDataDict = [[NSMutableDictionary alloc]init];
getDataDict = [self.mGetDataDict valueForKey:@"event"];
NSArray *dictAllKeys = [[NSArray alloc] init];
dictAllKeys = [getDataDict allKeys];
NSLog(@"dict :%d", [dictAllKeys count]);
for(int i=0; i<[getDataDict count]; i++)
{
NSString *strKey = [dictAllKeys objectAtIndex:i];
[dictAllValues addObjectsFromArray:[getDataDict valueForKey:strKey]];
if(i==0)
{
NSArray *cVals = [dictAllValues valueForKey:strKey];
int c = [cVals count];
NSLog(@"values:%@", cVals);
NSLog(@"values:%@", dictAllValues);
[self.mArrMOneEvents addObject:[NSString stringWithFormat:@"%d", c]];
self.mArrMOneEtType = [dictAllValues valueForKey:@"type"];
self.mArrMOneEtTime = [dictAllValues valueForKey:@"time"];
self.mArrMOneEtSeatMap = [dictAllValues valueForKey:@"createdSeatMap"];
self.mArrMOneEtSeatId = [dictAllValues valueForKey:@"seatMapId"];
self.mArrMOneEtQuant = [dictAllValues valueForKey:@"quantity"];
self.mArrMOneEvents = [dictAllValues valueForKey:@"eventName"];
self.mArrMOneETLoc = [dictAllValues valueForKey:@"location"];
self.mArrMOneEtEId = [dictAllValues valueForKey:@"id"];
self.mArrMOneEtDesc = [dictAllValues valueForKey:@"description"];
self.mArrMOneEtDate = [dictAllValues valueForKey:@"date"];
self.mArrMOneEtCurr = [dictAllValues valueForKey:@"currency"];
self.mArrMOneEtCost = [dictAllValues valueForKey:@"cost"];
self.mArrMOneEtCateg = [dictAllValues valueForKey:@"category"];
self.mArrmOneEtImg = [dictAllValues valueForKey:@"banner"];
NSLog(@"array one:%d", [self.mArrMOneEvents count]);
}
}
下图描述了本系统的要求。
需要响应的方式与来自服务器的响应方式相同,请为上述内容提供指导。提前感谢。您的主要问题是JSON响应格式不正确。JSON响应中有许多不需要的东西。 看看您的JSON响应:
{
event: {
July: [
{
createdSeatMap: "yes",
status: "1",
completed: "1",
eventPayment: "0",
}
]
}
}
在您的情况下,事件应该是不同月份的一系列事件。现在,在每个数组中,您将拥有该月的所有事件。将上面示例中的键作为值添加到数组中,而不是将其设置为键。请参见您的响应的示例:
{
event: {
[
Month : "July", <<--- //See this Line.
{
createdSeatMap: "yes",
status: "1",
completed: "1",
eventPayment: "0",
}
]
}
}
当服务器返回字典时,您的响应将永远无法维持顺序。您应该按照上述从服务器端修改响应。一种对字典键进行排序的复杂方法
NSCalendar *calender = [NSCalendar currentCalendar];
NSDateFormatter *dateFormatter = [NSDateFormatter new];
[dateFormatter setDateFormat:@"MMM"];
NSDateComponents *components = [NSDateComponents new];
components.month = 1;
NSMutableArray *months = [@[] mutableCopy];
NSDate *date = [NSDate date];
[months addObject:[dateFormatter stringFromDate:date]];
while ([months count]<12){
date = [calender dateByAddingComponents:components toDate:date options:0];
[months addObject:[dateFormatter stringFromDate:date]];
}
//A sample dictionary to test
NSDictionary *dictionary = @{@"Jan": @"",
@"Feb": @"",
@"Mar": @"",
@"Apr": @"",
@"May": @"",
@"Jun": @"",
@"Jul": @"",
@"Aug": @"",
@"Sep": @"",
@"Oct": @"",
@"Nov": @"",
@"Dec": @""};
NSArray *keys = [[dictionary allKeys] sortedArrayUsingComparator:
^NSComparisonResult(NSString * key1, NSString * key2) {
NSUInteger index1 = [months indexOfObject:[key1 substringToIndex:3]];
NSUInteger index2 = [months indexOfObject:[key2 substringToIndex:3]];
return [@(index1) compare:@(index2)];
}];
NSLog(@"keys : %@",keys);
服务器正在返回字典,因此没有订单。你的意思是你需要从响应的JSON字符串中获取顺序?一个问题:为什么你只想按这个顺序?再次问完全相同的问题是非常糟糕的形式。@Vin我已经编辑了我的问题,请检查,我需要这个,因为我正在显示从当前月份开始的一年中的十二个月,每个月可能有也可能没有事件。所以表视图是按月设置的,因此需要按顺序使用json。@Borrden我知道,但如果只是想得到答案,当我得到答案时,我会自己删除另一个。在月份中给出什么静态数据或没有得到什么。@iPhone6 month不是静态数据,它是动态形成的。如果当前月份是7月。订单将是7月到明年6月。如果是10月,则月份将是10月到9月。基本想法是有一个参考数组。您可以根据它对密钥进行排序。您是对的,格式不正确,但我对php不太了解,不知道如何处理这个问题。请告诉php开发人员。@iPhone6:请给出我添加的响应。如果您的服务器响应格式如下,那么您的问题将得到解决。上述答案都不符合要求,因此,我根据我的要求对JSON进行了更改,从而完全改变了问题。所以我既不能在这里发布我自己的答案,也不能接受上面的任何答案。@iPhone6:这就是我在答案中提出的建议,这就是为什么我的答案是最相关的。我没有做你的更改,在JSON中,某处月份的名称是完整的,而某处是简短的,因此我所做的是将所有名称更改为全名,然后自动获取排序数据。
NSCalendar *calender = [NSCalendar currentCalendar];
NSDateFormatter *dateFormatter = [NSDateFormatter new];
[dateFormatter setDateFormat:@"MMM"];
NSDateComponents *components = [NSDateComponents new];
components.month = 1;
NSMutableArray *months = [@[] mutableCopy];
NSDate *date = [NSDate date];
[months addObject:[dateFormatter stringFromDate:date]];
while ([months count]<12){
date = [calender dateByAddingComponents:components toDate:date options:0];
[months addObject:[dateFormatter stringFromDate:date]];
}
//A sample dictionary to test
NSDictionary *dictionary = @{@"Jan": @"",
@"Feb": @"",
@"Mar": @"",
@"Apr": @"",
@"May": @"",
@"Jun": @"",
@"Jul": @"",
@"Aug": @"",
@"Sep": @"",
@"Oct": @"",
@"Nov": @"",
@"Dec": @""};
NSArray *keys = [[dictionary allKeys] sortedArrayUsingComparator:
^NSComparisonResult(NSString * key1, NSString * key2) {
NSUInteger index1 = [months indexOfObject:[key1 substringToIndex:3]];
NSUInteger index2 = [months indexOfObject:[key2 substringToIndex:3]];
return [@(index1) compare:@(index2)];
}];
NSLog(@"keys : %@",keys);