字典的例子
let dict = ["a": 1, "b": 2, "c": 3]
然后字典他是没有顺序的。运行的时候他的key,a,b,c会不定顺序
使用系统的方法:
let jsonData = try? JSONSerialization.data(withJSONObject: dict, options: [])
let jsonString = String(data: jsonData!, encoding: .utf8)
print(jsonString)
输出如下:
Optional("{\"b\":2,\"c\":3,\"a\":1}")
系统在iOS11的时候也有一个设置可以对字典排序
if #available(iOS 11.0, *) {
let jsonData = try? JSONSerialization.data(withJSONObject: dict, options: [.sortedKeys])
let jsonString = String(data: jsonData!, encoding: .utf8)
print(jsonString)
}
输出如下:
Optional("{\"a\":1,\"b\":2,\"c\":3}")
下面找了两种排序的方法。
方法一:
func creatJsonString(dict: [String:Any]) ->String{
if(!JSONSerialization.isValidJSONObject(dict)) {
print("无法解析出JSONString")
return""
}
var namedPaird = [String]()
let sortedKeysAndValues = dict.sorted{ $0.0 < $1.0 }
for(key, value) in sortedKeysAndValues {
if value is [String:Any] {
namedPaird.append("\"\(key)\":\(creatJsonString(dict: value as! [String:Any]))")
}else if value is [Any] {
namedPaird.append("\"\(key)\":\(value)")
}else{
namedPaird.append("\"\(key)\":\"\(value)\"")
}
}
let returnString = namedPaird.joined(separator:",")
return"{\(returnString)}"
}
方法二:
class MutableOrderedDictionary: NSDictionary {
let _values: NSMutableArray = []
let _keys: NSMutableOrderedSet = []
override var count: Int {
return _keys.count
}
override func keyEnumerator() -> NSEnumerator {
return _keys.objectEnumerator()
}
override func object(forKey aKey: Any) -> Any? {
let index = _keys.index(of: aKey)
if index != NSNotFound {
return _values[index]
}
return nil
}
func setObject(_ anObject: Any, forKey aKey: String) {
let index = _keys.index(of: aKey)
if index != NSNotFound {
_values[index] = anObject
} else {
_keys.add(aKey)
_values.add(anObject)
}
}
}
extension MutableOrderedDictionary {
private static let defaultOrder: ((String, Any), (String, Any)) -> Bool = {
$0.0.compare($1.0, options: [.forcedOrdering, .caseInsensitive]) == .orderedAscending
}
static func sorted(object: Any, by areInIncreasingOrder: ((key: String, value: Value), (key: String, value: Value)) -> Bool = defaultOrder) -> Any {
if let dict = object as? [String: Any] {
return MutableOrderedDictionary(dict, by: areInIncreasingOrder)
} else if let array = object as? [Any] {
return array.map { sorted(object: $0, by: areInIncreasingOrder) }
} else {
return object
}
}
convenience init(_ dict: [String: Any], by areInIncreasingOrder: ((key: String, value: Value), (key: String, value: Value)) -> Bool = defaultOrder) {
self.init()
dict.sorted(by: areInIncreasingOrder)
.forEach { setObject(MutableOrderedDictionary.sorted(object: $0.value, by: areInIncreasingOrder), forKey: $0.key) }
}
}
用法:
// force ordering
let orderedJson = MutableOrderedDictionary(jsonObject)
// write pretty printed
_ = JSONSerialization.writeJSONObject(orderedJson, to: outputJSON, options: [.prettyPrinted], error: nil)