我正在尝试在Linux上使用Swift。
我有一些数据,它们是由String键和任意类型的值组成的字典,并且我正在尝试将它们序列化为JSON格式的字符串。
NSJSONSerialization.dataWithJSONObject
无法正常工作,它会报错:Argument type '[String : Any]' does not conform to expected type 'AnyObject'
let dict : [String : Any] = [
"string" : "Hello",
"int" : 1,
"double" : 3.14,
"array str" : ["a", "b", "c"],
"array double" : [1.0, 2.0, 3.0],
"array int" : [1, 2, 3]
]
我知道这是可行的,因为字典的字符串表示已经几乎符合正确的格式:
print("\(dict)")
["array int": [1, 2, 3], "int": 1, "array double": [1.0, 2.0, 3.0], "string": "Hello", "double": 3.1400000000000001, "array str": ["a", "b", "c"]]
在您建议将dict声明为
[String:AnyObject]
之前,请注意该字典是从动态数据中填充的,而不是作为文字声明的。如果可能的话,我希望限制使用可能在服务器上不可用的OSX或iOS特定库。 编辑: 这里是Enrico Granata提出的解决方案的实现:
protocol JSONSerializable {
func toJSON() -> String?
}
extension String : JSONSerializable {
func toJSON() -> String? {
return "\"\(self)\""
}
}
extension Int : JSONSerializable {
func toJSON() -> String? {
return "\(self)"
}
}
extension Double : JSONSerializable {
func toJSON() -> String? {
return "\(self)"
}
}
extension Array : JSONSerializable {
func toJSON() -> String? {
var out : [String] = []
for element in self {
if let json_element = element as? JSONSerializable, let string = json_element.toJSON() {
out.append(string)
} else {
return nil
}
}
return "[\(out.joinWithSeparator(", "))]"
}
}
extension Dictionary : JSONSerializable {
func toJSON() -> String? {
var out : [String] = []
for (k, v) in self {
if let json_element = v as? JSONSerializable, let string = json_element.toJSON() {
out.append("\"\(k)\": \(string)")
} else {
return nil
}
}
return "{\(out.joinWithSeparator(", "))}"
}
}
error: value of type 'Double' does not conform to expected dictionary value type 'AnyObject'
。 - MzzlNSJSONSerialization
可能仍然是Objective-C代码。我不想建议你切换到AnyObject
并将值包装为NSNumber
,因为这不是你在Swift中应该采取的丑陋解决方案。所以希望有人有比那更好的解决方案。我会打开一个playground并快速尝试一下。 - Tommy