【发布时间】:2017-08-13 13:33:47
【问题描述】:
我想解码 websocket“通知”的 json 响应,其中通知类型在 json 响应中。
JSON 示例:
{
"jsonrpc": "2.0",
"method": "Application.OnVolumeChanged",
"params": {
"data": {
"muted": false,
"volume": 88.6131134033203125
},
"sender": "xbmc"
}
}
这是我目前拥有的:
func notificationMessage(text: String) {
do {
if let jsonData = text.data(using: .utf8),
let json = try JSONSerialization.jsonObject(with: jsonData) as? [String: Any],
let method = json["method"] as? String,
let methodName = method.split(separator: ".").last?.description {
let decoder = JSONDecoder()
let object = try decoder.decode(OnVolumeChanged.self, from: jsonData)
print(object)
}
} catch {
print("Error deserializing JSON: \(error)")
}
}
现在我想用methodName 代替OnVolumeChanged.self。
但我不想在 methodName 上做一个巨大的 switch case,因为我可以获得数百种不同的方法
我试过NSClassFromString(methodName),但这给了我AnyClass?,这不是一个具体的类型。
有没有办法从字符串中获取类类型?
【问题讨论】:
-
你试过
NSClassFromString(method)而不是剥离method字符串的命名空间部分吗? -
decode()期待具体类型T.Type和AnyClass?基本上是任何东西。 -
这违背了 Swift 的静态类型系统,所以你将不得不逆流而上。但在你这样做之前,问问自己:你想为
OnVolumeChanged和AnotherMethodName捕获任何区别吗?如果是这样,请编辑您的问题以添加示例。 -
我在将 JSON 与类类型匹配时遇到了同样的问题,我最终使用了原始值与 JSON 字符串值匹配的枚举。
-
是的@CodeDifferent,json 中的数据对象对于每种方法都是不同的。但我会坚持使用包含所有可能方法的枚举,然后使用 switch case 确定应该使用哪个对象来解码 json。感谢您的信息!