我以前发表过一篇关于如何在模型here中保存json数据的文章。
现在好了,我正在迅速地在iOS上开发一个项目,并且遇到了以下问题,有时数据库管理员会不断更改列的名称,而我仅在 Alamofire 的帮助下使用服务,要在模型中保存数据,请使用camal case和蛇形case,目前一切正常,但根据我的经验,我想知道在快速模型中保存 json 数据的最佳方法是什么在Android上,我使用了@Serializename
进行改造,并且效果很好,因为如果修改了服务的json属性,我只需要更新一行代码,并且变量可以保持不变,就可以帮助我保持更好的状态。订单,并使其具有可扩展性。
在某些情况下,json出现了。
{
"price": "385.000000",
"nameusser": null,
"favorite": 43,
"short_nameProduct": "Génifique Repair Sc",
"description_product": "Génifique repair sc es la crema de noche antiedad de lancôme. Despiértese con una piel fresca y rejuvenecida con nuestra crema de noche.",
"alt": null,
"photo": "https://url/020021000112-1.png"
}
迅速就会以以下方式生成我的模型。
struct Product : Codable {
let price : String?
let nameusser : String?
let favorite : Int
let shortNameProduct : [Product]
let description : [Galery]
let alt : Product
let success : Bool
}
这里的问题是我的变量必须适合我使用JSONDecoder()
和convertFromSnakeCase
所获得的json,我自己无法定义它们。
在Java android中,我只需要那样做。
@SerializedName("price")
private String price;
@SerializedName("nameusser")
private String name;
@SerializedName("favorite")
private Int favorite;
@SerializedName("short_nameProduct")
private String shortName;
@SerializedName("description_product")
private String descriptionProduct;
@SerializedName("altitude")
private String altitude;
@SerializedName("photo")
private String photo;
我只需要创建get和set即可使用该模型。 我需要知道如何快速执行相同操作,也许是一个可以像在android中一样帮助我存储数据json的库。 任何评论将不胜感激。
答案 0 :(得分:0)
使用Alamofire,您将获得键值,Dictionary<String,Any>
或[String:Any]
因此您可以对字典执行以下操作:
var myProduct : Product?
if let price = myDictionary["price"] as? String{
myProduct.price = price
}
在该示例中,您可以创建一种将整个JSON映射到您的结构中的方法。也许,如果您想使其更具扩展性,可以使用String原始值创建一个枚举,并将其用作字典的键,例如:
enum productProperty : String{
case Price = "price"
}
var myProduct : Product?
if let price = myDictionary[productProperty.Price] as? String{
myProduct.price = price
}
也许可以创建一个更复杂的类来遍历字典并使用枚举检查键,但是该实现取决于您自己的技能。
编辑1:
要不与alamofire一起使用,您需要获取请求的jsonResponse,如下所示:
.request(yourURL, method: .get, parameters: yourParameter).responseJSON(options: .allowFragments , completionHandler: { response in
if let object = response.result.value as? Dictionary<String,Any> {
yourMethodToSave(object)
}
})
在yourMethodToSave(_ object: Dictionary<String,Any>)
内,您需要在上面加上逻辑。
Ps:@sendtobo答案有一个枚举示例,我告诉您可以使用更可扩展的对象映射
答案 1 :(得分:0)
最好的方法是使用编码键:
struct Product : Codable {
let price : String?
let nameusser : String?
let favorite : Int
let shortNameProduct : [Product]
let description : [Galery]
let alt : Product
let success : Bool
enum CodingKeys: String, CodingKey {
case price = "price"
case nameusser = "nameusser"
case favorite = "favorite"
case shortNameProduct = "short_nameProduct"
case description = "description_product"
case alt = "alt"
case success = "success"
}
}
枚举大小写的名称必须与结构上的属性名称匹配。这样,您无需编写任何自定义编码或解码代码即可定义所需的键。
答案 2 :(得分:0)
在这里随意使用我的要旨: Storage
您可以像这样使用它:
let fileName = "Product.json"
extension Product {
func store() {
Storage.store(self, to: .documents, as: fileName)
}
static func retrieve() -> Product? {
guard let product = Storage.retrieve(fileName, from: .documents, as: Product.self) else {
return nil
}
return product
}
}