NSJSONSerialize
和朋友只能处理对应于JSON本机数据类型的NSObject子项(NSNumber,NSString,NSArray,NSDictionary和NSNull)的小子集。另外,如果键和值都是NSObject或者固有可转换为NSObject(字符串和数字类型),则Dictionary只能转换为NSDictionary。
为了系列化你解释你需要枚举转换为那些NSJSONSerialize数据类型,类似于你的例子之一:
enum MyEnum : String {
case one = "one"
case two = "two"
}
let dict = ["one":MyEnum.one, "two":MyEnum.two]
var newDict = Dictionary<String, String>()
for (key, val) in dict {
newDict[key] = val.rawValue
}
let data = NSJSONSerialization.dataWithJSONObject(newDict, options: .allZeros, error: nil)
作为替代方案,因为这种操作是相当常见的,你可能需要考虑增加这一类辞书,这使得它方便map
功能:
extension Dictionary {
init(_ pairs: [Element]) {
self.init()
for (k, v) in pairs {
self[k] = v
}
}
func map<K: Hashable, V>(transform: Element -> (K, V)) -> [K: V] {
return Dictionary<K, V>(Swift.map(self, transform))
}
}
一旦这样做了,转换很简单:
let mapped = dict.map { (key, value) in (key, value.rawValue) }
是的,我怀疑是这样。我非常期待本机Swift方法来处理JSON,因为如果这确实是解决方案,那么在处理JSON繁重代码时,我可能不会使用枚举。 – thatidiotguy
对于更一般的用法,我倾向于将NSJSONSerialization包装为依赖于JSONSerializable协议的功能,该协议包含一个将对象转换为JSONSerializable表单的'convertToJson'对象。然后,像你在这里使用的简单枚举可以实现该方法作为'return rawValue' –
啊有趣。这通常是一个很好的方法。然而,我只是将这个问题的一个实例作为一个问题,所以我可能只是摆脱了我的项目中的枚举。无论如何,我并没有做太多的工作,只是习惯于使用Java日子里的枚举。感谢指针,但。 – thatidiotguy