问题描述
对于我的响应 api 看起来像这样
{
"properties": {
"is_enable_widget": true,"showing_widget": 10,"onboard_time": 5,"application_name": "magic_wondering"
.
.
.
}
}
在属性领域,它也有参数数量和动态类型的动态。 我这样声明我的对象
struct ConfigurationsModels: Codable {
let properties: [String: Any]?
enum CodingKeys: String,CodingKey {
case properties
}
}
但我收到错误 Type 'ConfigurationsModels' does not conform to protocol 'Decodable'
我不知道将我的 json 转换为 [String: Any]?
。以前有人这样做过吗?
解决方法
您不能将 Any
与 Codable
一起使用,您应该将 JSONSerialization
用于动态值类型和键
do {
if let json = try JSONSerialization.jsonObject(with: data,options: []) as? [String: Any] {
}
} catch {
print(error)
}
,
您需要为您的属性创建自定义模型。像这样声明你的数据模型:
const fetchData = async () => {
const result = await axios(url);
setData(result.data);
};
fetchData();
},[]); /* <-- do this */```
编辑:
你可以这样使用:
struct ConfigurationsModels: Codable {
let properties: Properties
}
struct Properties: Codable {
let isEnabledWidget: Bool
let showingWidget: Int
let onboardTime: Int
let applicationName: String
// Add more property here if needed
enum CodingKeys: String,CodingKey {
case isEnabledWidget = "is_enable_widget"
case showingWidget = "showing_widget"
case onboardTime = "onboard_time"
case applicationName = "application_name"
}
}
,
最短的方法是
您的可解码模型(如果可以从后端避免,请在属性类型中使用可选项)
struct ResponseModel: Decodable {
let properties: Properties
struct Properties: Decodable {
let isEnableWidget: Bool
let showingWidget: Int
let onboardTime: Int
let applicationName: String
}
}
你的解码器,使用 keyDecodingStrategy 你不能实现enum CodingKeys
let decoder = JSONDecoder()
decoder.keyDecodingStrategy = .convertFromSnakeCase
let model = try? decoder.decode(ResponseModel.self,from: data)decoder.decode(ResponseModel.self,from: data)