如何从本地JSON文件获取地址?附JSON格式及Swift代码
从本地JSON文件读取地址信息的Swift实现
首先先把你的JSON格式补全(原格式缺少闭合符号),如果是要存储联系人列表,推荐给根节点设置有意义的键名(比如contacts),完整结构如下:
{ "contacts": [ { "name": "张三", "phone": "138xxxx1234", "address": "北京市朝阳区XX街道", "landmark": "XX大厦旁", "mainarea": "朝阳区" }, { "name": "李四", "phone": "139xxxx5678", "address": "上海市浦东新区XX路", "landmark": "XX地铁站附近", "mainarea": "浦东新区" } ] }
注:如果你的JSON根键必须是空字符串,后面的代码也可以适配,只需要调整解析时的键名即可。
接下来我帮你优化代码逻辑,实现稳定读取地址信息的功能,同时避免原代码里的强制解包风险:
// 推荐用模型类管理联系人数据,比字典更安全易维护 struct Contact: Codable { let name: String let phone: String let address: String let landmark: String let mainarea: String } func loadAllContacts() { // 安全获取本地存储的城市代码,避免强制解包崩溃 guard let cityCode = UserDefaults.standard.string(forKey: "selectedLocationCode"), let jsonData = loadJSONData(fileCode: cityCode) else { print("无法获取城市代码或读取JSON文件") return } // 方式1:用Codable解析(推荐,代码简洁且类型安全) do { // 如果JSON根键是空字符串,就把这里的"contacts"改成"" let jsonResult = try JSONDecoder().decode([String: [Contact]].self, from: jsonData) guard let allContacts = jsonResult["contacts"] else { print("JSON中未找到联系人数据") return } // 遍历所有联系人,提取地址信息 for contact in allContacts { print("联系人:\(contact.name),地址:\(contact.address),地标:\(contact.landmark)") // 这里可以把地址信息存入数组或做其他业务处理 } } catch { print("JSON解析失败:\(error.localizedDescription)") return } // 方式2:手动解析字典(如果不想用Codable) /* do { guard let jsonObject = try JSONSerialization.jsonObject(with: jsonData) as? [String: Any], let contactsArray = jsonObject["contacts"] as? [[String: Any]] else { print("JSON格式不符合预期") return } for contactDict in contactsArray { if let name = contactDict["name"] as? String, let address = contactDict["address"] as? String { print("联系人:\(name),地址:\(address)") } } } catch { print("JSON解析失败:\(error.localizedDescription)") } */ } // 补充本地JSON文件读取的实现逻辑 func loadJSONData(fileCode: String) -> Data? { guard let filePath = Bundle.main.path(forResource: fileCode, ofType: "json"), let fileData = try? Data(contentsOf: URL(fileURLWithPath: filePath)) else { print("找不到指定的JSON文件") return nil } return fileData }
优化点说明:
- 类型安全的Codable解析:替代原代码里的字典强制转换,避免类型不匹配导致的崩溃,代码可读性也更高。
- 安全的可选值处理:用
guard let替代as!这类强制解包操作,让代码更稳定。 - 清晰的逻辑分层:先验证城市代码和文件读取结果,再进行解析,最后提取地址信息,流程更清晰。
- 完善的错误提示:每一步都添加了错误打印,方便排查问题。
内容的提问来源于stack exchange,提问作者user8604412
相关产品推荐
相关产品推荐

