2017-02-17 59 views
0

有3個字符串變量有序字典的JSON

public var userLoginId : String? 
public var searchString : String? 
public var tableName : String? 

我有一本字典:

let dict = ["userLoginId" : userLoginId, "searchString" : searchString,"tableName" : tableName] 

現在我通過JSON序列化:

let data = try! JSONSerialization.data(withJSONObject: dict, options :[]) 
let jsonstring = String(data:data, encoding:.utf8)! 

jsonstring,每次我得到一個如下所示的無序JSON:

"{\"tableName\":\"null\",\"userLoginId\":\"Dilip\",\"searchString\":\"Tata\"}" 

我怎樣才能得到相同的格式,我給字典賦值?

+4

'Dictionary'沒有任何順序。 –

+1

我知道字典沒有任何順序,但首先想到的是,我需要JSON以與將數據放入字典的順序相同的順序。其次,爲了生成JSON,Dictionary是最佳解決方案,但是我是IOS新手,這就是爲什麼我面臨問題 –

+0

@Nirav D,當JSON數據序列化並反序列化爲字典時,排序非常有用。由於字典沒有順序,所以即使來自同一個字典,也可能會寫很多不同的JSON字符串。有沒有一些方法來反序列化JSON而不使用Dict? – Efren

回答

0

字典是「無序集合」。他們對他們的鍵/值對沒有任何順序。期。

如果您想要訂購的集合,請使用除字典以外的其他東西。 (單項詞典數組是一種實現方法)。您也可以編寫代碼,將字典的鍵加載到可變數組中,對數組進行排序,然後使用已排序的鍵數組獲取鍵中的鍵/值對所需的順序。

您也可以創建自己的集合類型,它使用字符串作爲索引並按排序順序保存這些項目。 Swift使得這個過程簡單明瞭,儘管這在計算上會很昂貴。

+0

,您也可以按照標準進行排序,正如您所說的:「您還可以編寫代碼,將字典的鍵加載到可變數組中,對數組進行排序,然後使用排序後的數組鍵來獲取鍵/值對「,購買Zalak,這裏的按鍵數組將按字母順序排序,但我的關注點是字典索引不按字母順序升序,降序 –

2

不僅斯威夫特的Dictionary沒有排序,但也沒有按照標準的JSON字典。你可以做的最好的方法是將鍵以正確的順序存儲在一個數組中。而不是迭代字典,而是迭代有序數組,然後使用這些鍵從字典中獲取。

要避免手動重複鍵,你可以表達你的詞典作爲(Key, Value)元組數組,像這樣:

let keyValuePairs = [ 
    ("userLoginId", userLoginId), 
    ("searchString", searchString), 
    ("tableName", tableName) 
] 

然後你可以使用這個漂亮的Dictionary擴展,從這些(Key, Value)創建一個新的Dictionary元組:

extension Dictionary { 
    init(_ keyValuePairs: [(Key, Value)]) { 
     self.init(minimumCapacity: keyValuePairs.count) 

     for (key, value) in keyValuePairs { 
      self[key] = value 
     } 
    } 
} 

let dict = Dictionary(keyValuePairs) 
let orderedKeys = keyValuePairs.map{ $0.0 } 

現在你可以使用orderedKeys在你的銀行代碼,或儲存在他們旁邊JSON的dict

print("Example usage:") 
for key in orderedKeys { 
    let value = dict[key]! 

    print("\(key): \(value)") 
} 
0

我知道這是一年前問的。但是我最近在編寫單元測試時遇到了這個問題。基本上我寫了一個模擬JSON字典,使用JSONSerialization將其轉換爲數據,並將其傳遞給各種解析對象。然而,在這個特定的測試中,命令必須得到維護,否則測試會失敗,並且前面描述的方法沒有這樣做。所以對我而言,我所做的不是從字典開始,而是從測試JSON字符串開始,並使用utf8將其編碼爲數據。將其解析爲字典時,JSON字符串的順序將保留在解析的字典中。