为何JSON解码后需以属性而非字典下标方式访问数据?
为什么解码后用属性访问而非字典下标?
这本质是你解码得到的是自定义结构体实例,不是Swift原生字典,具体原因拆解:
你定义的
Cars结构体是专门对应外层JSON结构的Codable类型,JSONDecoder会严格按照你定义的结构体字段,把JSON里的键值对映射成结构体的属性——JSON里的"cars"键,会直接对应到Cars结构体的cars属性,最终返回的result是Cars类型的实例,不是[String: Any]字典。Swift中,结构体/类的成员访问语法是
.,而字典的键访问才用[]下标。你预期的result["cars"]是字典的用法,但这里result根本不是字典,自然不能这么用。如果确实想得到字典类型的结果,你可以不用自定义
Codable结构体,直接解码成[String: Any],比如:
let result = try JSONSerialization.jsonObject(with: data) as? [String: Any] // 这时才能用result?["cars"]访问
但这种方式需要手动做类型转换,远不如自定义Codable类型安全、便捷。
附你给出的原始代码和JSON:
原始JSON数据
{"cars": [{"name": "Ferrari","price": "100"},{"name": "Lamborghini","price": "200"},{"name": "Ford Pinto","price": "1"}]}
自定义Codable结构体
struct Cars: Codable { let cars: [Car] } struct Car: Codable, Hashable, Identifiable { let id = UUID() let name: String let price: String }
内容的提问来源于stack exchange,提问作者Duck
相关产品推荐
相关产品推荐

