Swift 字符串字典:任何不符合协议';可解码';
我试图实现一个可解码的方法来解析json请求,但是json请求在对象内部有一个字典 这是我的密码:Swift 字符串字典:任何不符合协议';可解码';,swift,decodable,Swift,Decodable,我试图实现一个可解码的方法来解析json请求,但是json请求在对象内部有一个字典 这是我的密码: struct myStruct : Decodable { let content: [String: Any] } enum CodingKeys: String, CodingKey { case content = "content" } 但我得到了一个错误: 类型“MyClass.myStruct”不符合协议“Decoda
struct myStruct : Decodable {
let content: [String: Any]
}
enum CodingKeys: String, CodingKey {
case content = "content"
}
但我得到了一个错误:
类型“MyClass.myStruct”不符合协议“Decodable”
如果没有此错误,如何将变量声明为字典
非常感谢您的帮助您目前无法使用Swift编码框架解码
[String:Any]
。如果需要解码[String:Any]
,则需要使用较低级别的反序列化策略并“手动”解码。例如,如果您的输入是JSON,则可以使用Foundation的JSONSerialization
或类似的第三方库
关于这一问题的讨论一直围绕着快速发展展开。苹果公司的主要编码/可编码程序员Itai Ferber参与了讨论,并对提供解决方案感兴趣,但(可能会在2018年WWDC上公布,并在2018年9月/10月左右最终确定)
您可以将的实现(它是开源的)复制到您的项目中,并对其进行修改,以添加获取未评估的
[String:Any]
的功能。Itai讨论了我在上面链接的线程中所需的修改。嗯。。。从技术上讲,您可以这样做,但这将要求您使用第三方组件作为字典表示
另外,我假设您这样做是因为内容
可能有非规范化数据,并且您有意将其视为字典
在这种情况下,请继续执行以下操作:
import SwiftyJSON
struct MyStruct : Decodable {
//... your other Decodable objects like
var name: String
//the [String:Any] object
var content: JSON
}
这里,JSON
是代表字典的快速JSON对象。事实上,它也代表了一个数组
工作示例:
字典是不可解码的。可能会发布JSON。
Any
不符合Decodable
,因此Dictionary
也不符合。如果您实际上需要存储具有完全动态键/值的字典,因此不能使用具体类型而不是Any
,那么您需要坚持使用JSONSerialization
。如果您确实知道所有键及其值的预期类型,则将这些值存储为具有具体类型的类的属性。@user2924482请看我的。两者最佳:可解码的
+[字符串:任意]
let jsonData = """
{
"name": "Swifty",
"content": {
"id": 1,
"color": "blue",
"status": true,
"details": {
"array" : [1,2,3],
"color" : "red"
}
}
}
""".data(using: .utf8)!
do {
let test = try JSONDecoder().decode(MyStruct.self,
from: jsonData)
print(test)
}
catch {
print(error)
}