首页 > Swift Dictionary转成String后Base64加密的坑

Swift Dictionary转成String后Base64加密的坑

准备用 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 值存储的

【热门文章】
【热门文章】