准备用 swfit 写一个七牛生成 token 的算法,发现将 Dictionay 转成 JSON 再生成 URL 安全的 Base64 编码与在线实例不一致
func JSONStringify(value: AnyObject,prettyPrinted:Bool = false) -> String{
let options = prettyPrinted ? NSJSONWritingOptions.PrettyPrinted : NSJSONWritingOptions(rawValue: 0)
if NSJSONSerialization.isValidJSONObject(value) {
do{
let data = try NSJSONSerialization.dataWithJSONObject(value, options: options)
if let string = NSString(data: data, encoding: NSUTF8StringEncoding) {
return string as String
}
}catch {
print("error")
//Access error here
}
}
return ""
}
let jsonObject: [String : AnyObject] = ["scope":"Blog","deadline":1448340828]
let jsonString = JSONStringify(jsonObject)
let Data = jsonString.dataUsingEncoding(NSUTF8StringEncoding)
let encoded = Data?.base64EncodedStringWithOptions(NSDataBase64EncodingOptions.Encoding64CharacterLineLength)
let demoStr = "{\"scope\":\"Blog\",\"deadline\":1448340828}"
let demoData = demoStr.dataUsingEncoding(NSUTF8StringEncoding)
let demoEncoded = demoData?.base64EncodedStringWithOptions(NSDataBase64EncodingOptions.Encoding64CharacterLineLength)
print(encoded)
print(demoEncoded)
输出结果
{"deadline":1448340828,"scope":"Blog"}
{"scope":"Blog","deadline":1448340828}
Optional("eyJkZWFkbGluZSI6MTQ0ODM0MDgyOCwic2NvcGUiOiJCbG9nIn0=")
Optional("eyJzY29wZSI6IkJsb2ciLCJkZWFkbGluZSI6MTQ0ODM0MDgyOH0=")
手动构建字面量 String 的 demoEncoded 与在线实例是一致的,构建 Dictionary 转化的 encode 与实例不一致,一直没弄明白症结。
从输出来看,貌似是转成String后key值的顺序有关,是什么原因导致生成 String 后 key 顺序不一致不清楚。应该与 Dictionay 添加前后没有关系, key 存储是以 hash 值存储的