1

重複の可能性:
JSONkit の並べ替えの問題

私は次のjsonを持っています

[
  {
    "Pending": 67,
    "Past Due": 63,
    "Invites": 0
  },
  {
    "Reading Approval": 4,
    "Schedule Approval": 16,
    "Session Assignment": 1
  },
  {
    "Reading Approval": 3,
    "Schedule Approval": 20,
    "Class Approval": 20,
    "Module Approval": 2,
    "Training Plan Review": 2,
    "Job Confirmation": 1
  }

]

json 文字列を nsarray に割り当てると、辞書内の値がアルファベット順に並べ替えられます。

NSArray *arr = [strResult JSONValue]; 

json 文字列と同じ順序を維持するにはどうすればよいですか?

arr = 
{
  Invites = 0;
  "Past Due" = 63;
  Pending = 67;
},
{
  "Reading Approval" = 4;
  "Schedule Approval" = 16;
  "Session Assignment" = 1;
},
{
  "Class Approval" = 20;
  "Job Confirmation" = 1;
  "Module Approval" = 2;
  "Reading Approval" = 3;
  "Schedule Approval" = 20;
  "Training Plan Review" = 2;
}
)

これは私が表示したいテーブルです:

Group 1
  Pending    67
  Past Due   63
  Invites    0

Group 2
  Reading Approval    4
  Schedule Approval   16
  Session Assignment  1

Group 3
  Reading Approval      3
  Schedule Approval     20
  Class Approval        20
  Module Approval       2
  Training Plan Review  2
  Job Confirmation      1
4

3 に答える 3

2

標準の JSON パーサーを使用して、データを変更する必要があります。

[
  [
    { "Pending": 67 },
    { "Past Due": 63 },
    { "Invites": 0 }
  ],
  [
    { "Reading Approval": 4 },
    { "Schedule Approval": 16 },
    { "Session Assignment": 1 }
  ],
  [
    { "Reading Approval": 3 },
    { "Schedule Approval": 20 },
    { "Class Approval": 20 },
    { "Module Approval": 2 },
    { "Training Plan Review": 2 },
    { "Job Confirmation": 1 }
  ]
]

JSON形式を変更できると仮定します。


データへのアクセス方法。セクションの配列があり、セクションと行のインデックスを知っていると仮定します。

NSArray *sections = ...
NSUInteger sectionIndex = ...
NSUInteger rowIndex = ...

NSArray *rows = [sections objectAtIndex:sectionIndex];
NSDictionary *cell = [rows objectAtIndex:rowIndex];

NSString *name = [[cell allKeys] objectAtIndex:0];
NSNumber *value = [cell objectForKey:name];

// What ever you need to do

すべてのデータを反復処理する場合

NSArray *sections = ...

for (NSArray *rows in sections) {
    for (NSDictionary *cell in rows) {
        NSString *name = [[cell allKeys] objectAtIndex:0];
        NSNumber *value = [cell objectForKey:name];

        // What ever you need to do
    }
}
于 2012-05-29T14:33:07.380 に答える
1

NSDictionary順序付けされていないコンテナ オブジェクトです。印刷される場合は、アルファベット順にソートされます。しかし、保証された順序はありません。

のドキュメンテーションはdescription:言う:

If each key in the dictionary is an NSString object, the entries are listed in ascending order by key, otherwise the order in which the entries are listed is undefined. [...]

allKeys:言います:

The order of the elements in the array is not defined.

また、次のようにallValuesも述べています。

The order of the elements in the array is not defined.

しかし、NSArray順序付けられたコンテナーです。これが、各 JSON エントリに配列を使用する必要があると Jeffery Thomas が述べている理由です。

ただし、次のように使用することもできます。

[
  [
    "keys": {"Pending","Past Due","Invites"},
    "values": {67,63,0}
  ],
  [
    "keys": {"Reading Approval","Schedule Approval","Session Assignment"},
    "values": {4,16,1},
  ],
  [
    "keys": {"Reading Approval","Schedule Approval","Class Approval",...},
    "values": {3,20,20,...},
  ]
]
于 2012-05-29T15:21:43.427 に答える
0

ディクショナリには順序付けされた項目がありません。並べ替えは、うまく表示するためだけに iOS によって行われます。ただし、ディクショナリ内の項目の順序を想定しないでください。

于 2012-05-29T15:14:09.430 に答える