我如何使用 [String: Any]?对于可解码对象?

问题描述

对于我的响应 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]?。以前有人这样做过吗?

解决方法

您不能将 AnyCodable 一起使用,您应该将 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)