2015-11-23 30 views
1

我试图在Swift中创建一个Base64字符串。我有一个Base64编码的字符串及其数组对象的例子。我现在的问题是,我不知道如何获得与示例中给出的等价数组。生成一个JSON数组并将其转换为一个Base64字符串

因为我不想在我的XCode项目中乱搞,所以我在操场上做了以下操作。

定的数组:

{"WHERE":{"Class":"%3f","Location":"3b"},"ORDER":["Day ASC","Location DESC"]} 

给Base64编码字符串:

eyJXSEVSRSI6eyJDbGFzcyI6IiUzZiIsIkxvY2F0aW9uIjoiM2IifSwiT1JERVIiOlsiRGF5IEFTQyIsIkxvY2F0aW9uIERFU0MiXX0= 

首先在下面,我想重现我解码例如串

let str = "eyJXSEVSRSI6eyJDbGFzcyI6IiUzZiIsIkxvY2F0aW9uIjoiM2IifSwiT1JERVIiOlsiRGF5IEFTQyIsIkxvY2F0aW9uIERFU0MiXX0=" 

let data = NSData(base64EncodedString: str, options: NSDataBase64DecodingOptions(rawValue: 0)) 

do { 
    let result = try NSJSONSerialization.JSONObjectWithData(data!, options: .AllowFragments) 
} catch let error { 
    print(error) 
} 
//"result" is ["WHERE": ["Class": "%3f", "Location": "3b"], "ORDER": ["Day ASC", "Location DESC"]] 

来自上面的字符串

var array = [String : AnyObject]() 
var arrayPartA = [String : String]() 
arrayPartA["Class"] = "%3f" 
arrayPartA["Location"] = "3b" 
array["ORDER"] = ["Day ASC", "Location DESC"] 
array["WHERE"] = arrayPartA 
array //The playground says that "array" is ["ORDER": ["Day ASC", "Location DESC"], "WHERE": ["Class": "%3f", "Location": "3b"]] 
     //"ORDER" and "WHERE" are switched but I don't get them to be at the right position 

let utf8str2: NSData = String(array).dataUsingEncoding(NSUTF8StringEncoding)! 

let encodedStr = utf8str2.base64EncodedStringWithOptions(NSDataBase64EncodingOptions(rawValue: 0)) 
//Here "encodedStr" is WyJPUkRFUiI6ICgKICAgICJEYXkgQVNDIiwKICAgICJMb2NhdGlvbiBERVNDIgopLCAiV0hFUkUiOiB7CiAgICBDbGFzcyA9ICIlM2YiOwogICAgTG9jYXRpb24gPSAzYjsKfV0= 
//but it should be eyJXSEVSRSI6eyJDbGFzcyI6IiUzZiIsIkxvY2F0aW9uIjoiM2IifSwiT1JERVIiOlsiRGF5IEFTQyIsIkxvY2F0aW9uIERFU0MiXX0= 

如果有人能向我解释我做错了什么以及如何重现给定的Base64字符串,我会很高兴。

因为我是这个网站的新手,我提前为错误的布局或其他可能的约定道歉,我不知道。

回答

1

两个重要的事情要明白:

  • 你所调用数组是不是一个数组,它的(含该订单键的数组)一个JSON字典。

小心不要混淆Swift和JSON之间的数组和字典的语法。在Swift中,一个数组:,字典:["a":0, "b":1]

在JSON中,一个数组:[0, 1],字典:{"a":0, "b":1}

  • 斯威夫特字典是一个无序集合。键值对没有“位置”。
0

你需要改变几件事情:

  1. 你输入的字符串(没有序列号)不是一个数组,而是一个JSON对象。
  2. 尝试使用适当的JSON库构建您的字符串,例如SwiftyJSON
  3. String(array)不足以将您的对象始终转换为字符串。您应该使用JSON序列化程序(例如SwiftyJSON json.rawString())。
2

你可以试试这个吗?这是你想要做的吗?它应该将字典转换为base64字符串

func jsonToBaseString (yourJSON: [String: String]) -> String? { 
    do { 
     let jsonData = try NSJSONSerialization.dataWithJSONObject(yourJSON, options: NSJSONWritingOptions.PrettyPrinted) 
     return jsonData.base64EncodedStringWithOptions(NSDataBase64EncodingOptions.EncodingEndLineWithCarriageReturn) 
    } catch { 
     return nil 
    } 
} 

字典是Swifts JSON表示...

0

让遵循建议使用一些JSON序列化,而是采取在帐户

{ 
    "alfa": 1, 
    "beta": true 
} 

{"beta":true,"alfa":1} 

在JSON符号代表相同的对象,即使他们的字符串表示(没关系如果base64编码或不)。

相关问题