Swift JSON 到词典<String: Any>。然后将 "Any" 转换为 NSMutableArray
Swift JSON to Dictionary<String: Any>. Then cast "Any" as NSMutableArray
我正在尝试从 JSON 字符串中读取数据并用其数据绘制图形:
{"y-axis-data":{"min":0.0,"max":1000,"Step":100.0},"x-labels":[1994,2000,2005],"y-values":[20,305,143]}
我写了一个函数来从字符串创建字典:
func jsonToDictionary(jsonString: String) -> [String: Any]? {
if let jsonData: Data = jsonString.data(using: String.Encoding.utf8) {
do {
return try (JSONSerialization.jsonObject(with: jsonData, options: []) as? [String: Any])!
} catch {
some bla bla
}
}
return nil
}
当我传递我的 JSON 字符串时,return 字典应该计算里面的 3 个元素,确实如此。
然后我可以更改一些变量 (Double),这些变量直到现在都是 0,并使用 {"min":0.0,"max":1000,"Step":100.0}
作为字典本身。工作正常。
我在尝试初始化其他属性时遇到了麻烦:
self.my_view!.x-labels = (jsonToDictionary!["x-labels"]) as? NSMutableArray
my_view 已经初始化为 UIViewCustomClass(frame: someFrame)
myview.x-labels
是一个 NSMutableArray
并且它被初始化为 nil。执行完那行代码还是nil,当然myview.x-labels.count
就是nil了。如果我这样做:
self.my_view!.x-labels = (jsonToDictionary!["x-labels"]) as! NSMutableArray
我收到警告:
Treating a forced downcast to NSMutableArray as optional will never produce nil.
然后它在运行时崩溃并出现以下错误:
Could not cast value of type '__NSArrayI' (0x110ed5448) to 'NSMutableArray' (0x110ed4598).
当然,"y-values"
也会发生完全相同的事情
正确的做法是什么?
我觉得,JSONSerializationclass转成Array,然后Swift不能把Array转成NSMutableArray。你可以这样做 (Swift4):
let array = (jsonToDictionary!["x-labels"]) as? [Int]
if array != nil {
self.my_view!.x-labels = NSMutableArray(array: array!)
}
这是因为你的 json!["x-labels"]
被隐含地视为 NSArray
,所以你不得不做一个 "double-force-cast"
// get the converted json
let j = jsonToDictionary(jsonString: dict)
// double cast
let m = (j!["x-labels"] as! NSArray).mutableCopy() as! NSMutableArray
结果:
我正在尝试从 JSON 字符串中读取数据并用其数据绘制图形:
{"y-axis-data":{"min":0.0,"max":1000,"Step":100.0},"x-labels":[1994,2000,2005],"y-values":[20,305,143]}
我写了一个函数来从字符串创建字典:
func jsonToDictionary(jsonString: String) -> [String: Any]? {
if let jsonData: Data = jsonString.data(using: String.Encoding.utf8) {
do {
return try (JSONSerialization.jsonObject(with: jsonData, options: []) as? [String: Any])!
} catch {
some bla bla
}
}
return nil
}
当我传递我的 JSON 字符串时,return 字典应该计算里面的 3 个元素,确实如此。
然后我可以更改一些变量 (Double),这些变量直到现在都是 0,并使用 {"min":0.0,"max":1000,"Step":100.0}
作为字典本身。工作正常。
我在尝试初始化其他属性时遇到了麻烦:
self.my_view!.x-labels = (jsonToDictionary!["x-labels"]) as? NSMutableArray
my_view 已经初始化为 UIViewCustomClass(frame: someFrame)
myview.x-labels
是一个 NSMutableArray
并且它被初始化为 nil。执行完那行代码还是nil,当然myview.x-labels.count
就是nil了。如果我这样做:
self.my_view!.x-labels = (jsonToDictionary!["x-labels"]) as! NSMutableArray
我收到警告:
Treating a forced downcast to NSMutableArray as optional will never produce nil.
然后它在运行时崩溃并出现以下错误:
Could not cast value of type '__NSArrayI' (0x110ed5448) to 'NSMutableArray' (0x110ed4598).
当然,"y-values"
也会发生完全相同的事情正确的做法是什么?
我觉得,JSONSerializationclass转成Array,然后Swift不能把Array转成NSMutableArray。你可以这样做 (Swift4):
let array = (jsonToDictionary!["x-labels"]) as? [Int]
if array != nil {
self.my_view!.x-labels = NSMutableArray(array: array!)
}
这是因为你的 json!["x-labels"]
被隐含地视为 NSArray
,所以你不得不做一个 "double-force-cast"
// get the converted json
let j = jsonToDictionary(jsonString: dict)
// double cast
let m = (j!["x-labels"] as! NSArray).mutableCopy() as! NSMutableArray
结果: