You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从本地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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 08:58:18