1

NSArrayにキー値文字列を追加していますが、それらは間違った順序で追加されているため、これは間違った方法であると私は信じています-

私のjsonは次の形式を取ります:

[{
    "story1":
        {data in here}
    "story2":
                {data in here}....

そして私のコードでは、NSArrayでstory1とstory2(およびそれ以上)の文字列値を取得したいと思っています。これは私が達成したものですが、それらは逆の順序です-story2、story1:

NSArray *jsonArr = [NSJSONSerialization JSONObjectWithData:theData options:kNilOptions error:&error];

for (NSString *pItem in [jsonArr objectAtIndex:0]) {
  NSLog(@"Product: %@", pItem);
}

これを行うためのより良い方法はありますか?そうでない場合は、どうすれば配列を逆にすることができますか?

4

2 に答える 2

1

JSONは、JSON配列内にJSONオブジェクトを定義します。デシリアライズすると、NSDictionaryを含むNSArrayが取得されます。これには、キーと値のペアが含まれますが、NSDictionaryはキーの順序を定義しません(JSONオブジェクトも定義しません)。すなわち

{ "story1" : "foo", "story2" : "bar" }

{ "story2" : "bar", "story1" : "foo" }

同じオブジェクトの表現です。

順序付けが必要な場合は、JSONデータを再構築する必要があります。次のようにトリックを行います

[
    { "story1" : { ... } },
    { "story2" : { ... } }
]

または、オブジェクトのデータにアクセスするときに、最初にキーを並べ替えることができます。あなたの例を使用して:

NSArray *jsonArr = [NSJSONSerialization JSONObjectWithData:theData ...];
NSDictionary *jsonDictionary = [jsonArr objectAtIndex: 0];

NSArray* sortedKeys = [[jsonDictionary allKeys] sortedArrayUsingComparator: (^NSComparator)(id obj1, id obj2) { /* a comparator */ }];
for (NSString *key in [sortedKeys]) 
{
    NSLog(@"Product: %@", [jsonDictionary objectForKey: key]);
}
于 2013-03-18T13:05:45.333 に答える
1
// Instead Normal NSArray user NSOrderedSet which preserves the order of objects
NSOrderedSet *orderSet = [NSOrderedSet orderedSetWithArray:jsonArr];

// Access your value From NSOrderedSet same as NSArray
NSDictionary *dict = [orderSet objectAtIndex:0];
NSLog(@"%@",dict);
于 2013-03-18T12:49:32.353 に答える