-3

この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: [
{
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]);
    }
}

これは私が試したものです

NSArray *keys = [[getDataDict allKeys] sortedArrayUsingSelector: @selector(compare:)];

NSMutableArray *array = [NSMutableArray arrayWithCapacity: [keys count]];
for (NSString *key in keys) {
    [array addObject: [getDataDict objectForKey: key]];
}
NSLog(@"array:%@", array);

以下は、この要件を説明する画像です。 ここに画像の説明を入力 サーバーからの応答と同様の応答が必要な場合は、上記を参考にしてください。前もって感謝します。

4

2 に答える 2

3

辞書のキーをソートする複雑な方法

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);
于 2013-07-11T09:53:35.697 に答える
1

あなたにとっての主な問題は、JSON 応答が適切にフォーマットされていないことです。JSON 応答には多くの不要なものがあります。JSON レスポンスを見てください:

{
event: {
            July: [
                      {
                          createdSeatMap: "yes",
                          status: "1",
                          completed: "1",
                          eventPayment: "0",
                      }
                  ]
       }
}

あなたの場合、異なる月のイベントの配列でeventある必要があります。これで、各配列にその月のすべてのイベントが表示されます。キー (上記の例では"July" ) をキーにする代わりに値として配列に追加します。応答がどのように見えるかの例を参照してください。

{
event: {
            [
                  Month : "July",      <<--- //See this Line.
                  {
                       createdSeatMap: "yes",
                       status: "1",
                       completed: "1",
                       eventPayment: "0",
                  }
             ]
       }
}

サーバーが Dictionary を返すため、 Response が順序を維持することはありません。サーバー側から上記のように応答を変更する必要があります。

于 2013-07-11T09:44:59.067 に答える