2013-12-09 33 views
1

我必須以JSON格式發送數據。我有我的nsdictionary與鍵和值。NSDictionary到JSON數據正在排序

NSDictionary *params_country=[NSDictionary dictionaryWithObjectsAndKeys: 
    @"1111",@"@id", 
    nil]; 

NSDictionary *params = [NSDictionary dictionaryWithObjectsAndKeys: 
    @"dummy3", @"@name", 
    @"[email protected]", @"@mail", 
    @"password",@"@password", params_country,@"country", 
    nil]; 

當我在做一個日誌

DLog(@"params %@",[params description]); 

我正在以下

params { 
    "@mail" = "[email protected]"; 
    "@name" = dummy3; 
    "@password" = password; 
} 

的問題是,我要發送的JSON在我列出的順序上面我的nsdictionary的初始化,但鍵正在排序。

任何解決方案?

編輯

對不起我也是發送的NSDictionary在PARAMS。如果我刪除國家,那麼它很好。

+0

可以粘貼期待您發送到服務器的JSON甲? – Joiningss

+0

該pb是一些鑰匙我有「@」標誌,其他人沒有 – veereev

+0

我會盡快發佈一個解決方案,當我進入辦公室!(大約一個小時) – liamnichols

回答

1

詞典是無序的集合類型。如果您需要維護某個訂單,那麼您應該使用像NSArray這樣的有序集合類型。但爲此,您的Web服務不應該關心訂單,因爲它應該通過提供的密鑰來查找值。

+0

你好,謝謝你的回覆,但在我的情況下,是的web服務正在照顧訂單。所以我應該以有序的方式發送數據。 – veereev

+5

這違反了JSON規範,它說「一個對象是零個或多個名稱/值對的無序集合,其中名稱是字符串,值是字符串,數字,布爾值,空值,對象或陣「。因此,您正在使用的不是JSON。如果你想要這個工作,你需要建立你自己的NSData對象,或者你可以修復你的Web服務。 –

1

按照一些評論,這個要求確實不比賽一個有效的JSON對象作爲官方JSON Specification狀態:

的目標是一無序集名稱/值對。一個對象以{(左大括號)開始並以}(右大括號)結束。每個名稱後跟:(冒號),名稱/值對由(逗號)分隔。

不幸的是,我們沒有生活在一個完美的世界中,完美的web服務,並且經常有某些東西超出了我們的控制範圍。

在互聯網上閱讀後,我寫了一個NSMutableDictionary的子類,該子類將根據您撥打setValue:forKey:的順序訂購字典。

我把全班學生分成你可以從這裏下載一個要點:https://gist.github.com/liamnichols/7869468或者你可以從下面複製:

LNOrderedMutableDictionary.h

@interface LNOrderedMutableDictionary : NSMutableDictionary 

///If `anObject` is nil, it will not be added to the dictionary. 
- (void)setNothingIfNil:(id)anObject forKey:(id)aKey; 

@end 

LNOrderedMutableDictionary.m

#import "LNOrderedMutableDictionary.h" 

@interface LNOrderedMutableDictionary() 

@property (nonatomic, strong) NSMutableDictionary *dictionary; 
@property (nonatomic, strong) NSMutableOrderedSet *array; 

@end 

@implementation LNOrderedMutableDictionary 

- (id)initWithCapacity:(NSUInteger)capacity 
{ 
    self = [super init]; 
    if (self != nil) 
    { 
     self.dictionary = [[NSMutableDictionary alloc] initWithCapacity:capacity]; 
     self.array = [[NSMutableOrderedSet alloc] initWithCapacity:capacity]; 
    } 
    return self; 
} 

- (id)init 
{ 
    self = [self initWithCapacity:0]; 
    if (self) 
    { 

    } 
    return self; 
} 

- (void)setObject:(id)anObject forKey:(id)aKey 
{ 
    [self.array removeObject:aKey]; 
    [self.array addObject:aKey]; 
    [self.dictionary setObject:anObject forKey:aKey]; 
} 

- (void)setNothingIfNil:(id)anObject forKey:(id)aKey 
{ 
    if (anObject != nil) 
     [self setObject:anObject forKey:aKey]; 
} 

- (void)removeObjectForKey:(id)aKey 
{ 
    [self.dictionary removeObjectForKey:aKey]; 
    [self.array removeObject:aKey]; 
} 

- (NSUInteger)count 
{ 
    return [self.dictionary count]; 
} 

- (id)objectForKey:(id)aKey 
{ 
    return [self.dictionary objectForKey:aKey]; 
} 

- (NSEnumerator *)keyEnumerator 
{ 
    return [self.array objectEnumerator]; 
} 

@end 

如果可能,您的網絡服務副主席不應該依賴JSON對象按照特定的順序進行格式化,但如果沒有什麼可以改變這一點,那麼上述解決方案就是你要找的。

來源:cocoawithlove