这里出了什么问题?或者我应该如何解码,我不会使用jsonserialize。
let jsonData = try! Data(contentsOf: urls[0])
let decoder = JSONDecoder()
let d = try decoder.decode([String: JSON].self, from: jsonData)
文件内容是一个简单JSON:
{"name": "fff", "price": 10}
还有我的JSON
代码:
public enum JSON: Decodable {
case string(String)
case number(Float)
case object([String:JSON])
case array([JSON])
case bool(Bool)
}
3条答案
按热度按时间kadbb4591#
您需要添加一个自定义的
init(from:)
,尝试在其中解码为每个可能的枚举情况,直到成功或引发错误为止这里是一个简短的版本,处理三种情况
正如@LeoDabus在注解中提到的,我们可以捕获typeMismatch错误(并直接抛出任何其他错误),或者像以前一样,如果没有解码成功,则在结尾抛出一个错误。(同样是一个缩短的版本)
wztqucjr2#
首先,不需要在JSON枚举中维护数据类型来解析响应。
如果您将对象与从本地维护的API或JSON文件接收的响应结构进行匹配,JSONDecoder将能够使用适当的数据类型进行解析
以您的json文件为例:
{【品名】:【fff】,【价格】:10个月}
解析此结构的建议方法如下
}
我标记了两个vars选项,以防在JSON响应中不存在该字段时处理失败。
通过创建解码器示例并设置Product.Self,使用在上一步中创建的product结构来解析对象
如果您在JSON响应中有相同结构的对象数组,请使用以下代码:
只需在产品对象前后包含[]
6ie5vjzr3#
你需要把它解码成一个结构