Мне нужно синхронизировать два файла json, чтобы добавить новый контент из Файл A (находится в комплекте приложения) в Файл B после обновления приложения.
Оба файла JSON являются массивами словарей.Мне нужно перебрать форму словаря Файл A и, основываясь на значении "id", если словарь отсутствует в Файл B Мне нужно добавить эти недостающие словари и сохранить Файл B обратно в файловую систему.
У меня есть решение ниже, которое делает это, и, кажется, работает.Но это так ужасно!Конечно, я собрал все это за 15 минут, пытаясь справиться, но я уверен, что должен быть лучший способ справиться с этим.Кроме того, я не хочу еще больше мутить воду, преобразовывая эти словари в структуры или модели для сравнения, только чтобы преобразовать их обратно в словари -> json.
Любой совет здесь был бы великолепен!Я предпочитаю чистый код, и это беспорядок.
typealias JSON = [[String: Any]]
static private func uglySync() {
let fileName: String = "someFileName"
guard let sourceUrl = Bundle.main.url(forResource: fileName, withExtension: "json") else { return }
guard let destinationDirectory = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first else { return }
let destinationUrl = destinationDirectory.appendingPathComponent("Data/" + fileName + ".json")
do {
let sourceData = try Data(contentsOf: sourceUrl)
do {
if let sourceArray = try JSONSerialization.jsonObject(with: sourceData, options: .mutableContainers) as? JSON {
do {
let destinationData = try Data(contentsOf: destinationUrl)
do {
if let destinationArray = try JSONSerialization.jsonObject(with: destinationData, options: .mutableContainers) as? JSON {
var mutableArray = destinationArray
sourceArray.forEach({ (item) in
if let itemId = item["id"] as? String {
let foundItem = destinationArray.filter { $0["id"] as! String == itemId }.first
if foundItem == nil {
mutableArray.append(item)
}
}
})
do {
let jsonData = try JSONSerialization.data(withJSONObject: mutableArray, options: .prettyPrinted)
try jsonData.write(to: destinationUrl)
} catch let error as NSError {
print("Couldn't write to file: \(error.localizedDescription)")
}
} else {
print("Cound not process json")
}
} catch {
print(error.localizedDescription)
}
} catch {
print(error.localizedDescription)
}
} else {
print("Cound not process json")
}
} catch {
print(error.localizedDescription)
}
} catch {
print(error.localizedDescription)
}
// oh wow the try catches :/
}