在快速模型中保存json数据的最佳方法是什么

时间:2019-06-18 16:32:36

标签: ios json swift model-view-controller model

我以前发表过一篇关于如何在模型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的库。 任何评论将不胜感激。

3 个答案:

答案 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
    }
}