Каков наилучший способ сохранить данные JSON в быстрой модели - PullRequest
1 голос
/ 18 июня 2019

Ранее я писал о том, как сохранить данные JSON в модели здесь . Хорошо, что сейчас я разрабатываю проект на iOS с помощью swift, и я сталкиваюсь со следующей проблемой: иногда администраторы баз данных постоянно меняют имена столбцов, я использую сервисы только с помощью Alamofire , чтобы сохранить данные в моделях, используйте случай camal и змею, на данный момент все хорошо, но я хотел бы знать, каков наилучший способ сохранить данные 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
}

Проблема здесь в том, что мои переменные должны соответствовать json, который я использую JSONDecoder() и convertFromSnakeCase, я не могу определить их сам.

в то время как в 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;

Мне просто нужно создать и получить, и я был бы готов использовать модель. Мне нужно знать, как сделать в Swift то же самое, может быть, библиотека, которая помогает мне хранить данные JSON так же, как я делаю в Android. Любой комментарий будет очень признателен.

Ответы [ 3 ]

0 голосов
/ 18 июня 2019

Лучший способ - использовать ключи кодирования:

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"
    }
}

Имя регистра перечисления должно совпадать с именем свойства в структуре.Таким образом, вы можете определить любые ключи, которые вам нужны, без необходимости писать какой-либо пользовательский код или код декодирования.

0 голосов
/ 18 июня 2019

Не стесняйтесь использовать мою суть здесь: Хранение

Вы можете использовать его так:


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
    }
}
0 голосов
/ 18 июня 2019

С 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
}

И, возможно, создайте более сложный класс для итерации по словарю и проверки ключа с помощью enum, но эта реализация зависит от ваших собственных навыков.

Edit1:

Чтобы использовать not с 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 приведен пример перечисления, который я могу использовать для более масштабируемого отображения вашего объекта

...