首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Swift 解析巢狀 JSON:responseinfo 字串轉模型陣列完整流程

     編輯:程式設計綜合問答

後端回傳 JSON 中 responseinfo 欄位為**雙重編碼的 JSON 字串** (字串內包含轉義引號的 JSON 陣列)。Swift 需兩次解碼:先解外層,再將 responseinfo 字串轉 Data 再解內層。

原始 JSON 結構

{
  "responsestatus": 1,
  "responsecode": "2002",
  "responseinfo": "[{\"USERID\":\"18265309900\",\"USERNAME\":\"麻雀貓\",...}, {\"USERID\":\"18505237553\",\"USERNAME\":\"喵大咪\",...}]"
}

模型定義

struct APIResponse: Codable {
    let responsestatus: Int
    let responsecode: String
    let responseinfo: String  // 先解為 String
}

struct User: Codable {
    let USERID: String
    let USERNAME: String
    let PASSWORD: String
    let PHONE: String
    let EMAIL: String
    let REMARK: String
    let STATUS: String
    let CMPID: String
    let MCMPID: String
    let OPTID: String
    let TRNDATE: String
    let CREATEID: String
    let CREATEDATE: String
    let LOGINDATE: String
    let IMGSRC: String
}

兩階段解碼實作

func parseUsers(from data: Data) throws -> [User] {
    // 1. 解析外層
    let outer = try JSONDecoder().decode(APIResponse.self, from: data)
    
    // 2. 將 responseinfo 字串轉 Data
    guard let innerData = outer.responseinfo.data(using: .utf8) else {
        throw ParseError.invalidResponseInfo
    }
    
    // 3. 解析內層陣列
    let users = try JSONDecoder().decode([User].self, from: innerData)
    return users
}

// 使用
do {
    let users = try parseUsers(from: responseData)
    print("解析到 \(users.count) 位用戶")
    users.forEach { print($0.USERNAME) }
} catch {
    print("解析失敗: \(error)")
}

關鍵點總結

  1. responseinfo 在外層模型中定義為 String,而非 [User] 或 Any。
  2. 使用 .data(using: .utf8) 將字串轉 Data 再送入 JSONDecoder。
  3. 內層 JSON 陣列直接對應 [User].self。
  4. 若後端可修改,建議**直接回傳陣列物件**而非字串,避免雙重解析與轉義問題。

進階:統一解碼器策略

let decoder = JSONDecoder()
decoder.keyDecodingStrategy = .convertFromSnakeCase  // 若欄位為 snake_case
decoder.dateDecodingStrategy = .formatted(dateFormatter)  // 統一日期格式

常見錯誤與修正

錯誤原因修正
dataCorrupted字串含非法轉義/編碼非 UTF-8確認後端輸出標準 JSON,必要時 .replacingOccurrences(of: "\\", with: "")
keyNotFound模型屬性名與 JSON key 大小寫不符加 CodingKeys 對應或用 .convertFromSnakeCase
typeMismatch數值型欄位實為字串模型統一用 String 再轉型,或用 JSONDecoder 的 nonConformingFloatDecodingStrategy

提問者最終回饋:「用自己的方法搞定了,看來是沒靜下心來認真看一看」。雙重解碼是處理「字串化 JSON」欄位的標準模式,熟記即可。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved