Để giải quyết vấn đề của mình, bạn có thể chia RawServerResponsequá trình triển khai của mình thành nhiều phần logic (sử dụng Swift 5).
# 1. Triển khai các thuộc tính và khóa mã hóa bắt buộc
import Foundation
struct RawServerResponse {
    enum RootKeys: String, CodingKey {
        case id, user, reviewCount = "reviews_count"
    }
    enum UserKeys: String, CodingKey {
        case userName = "user_name", realInfo = "real_info"
    }
    enum RealInfoKeys: String, CodingKey {
        case fullName = "full_name"
    }
    enum ReviewCountKeys: String, CodingKey {
        case count
    }
    let id: Int
    let userName: String
    let fullName: String
    let reviewCount: Int
}
# 2. Đặt chiến lược giải mã cho thuộc idtính
extension RawServerResponse: Decodable {
    init(from decoder: Decoder) throws {
        
        let container = try decoder.container(keyedBy: RootKeys.self)
        id = try container.decode(Int.self, forKey: .id)
                         
    }
}
# 3. Đặt chiến lược giải mã cho thuộc userNametính
extension RawServerResponse: Decodable {
    init(from decoder: Decoder) throws {
        
        
        let userContainer = try container.nestedContainer(keyedBy: UserKeys.self, forKey: .user)
        userName = try userContainer.decode(String.self, forKey: .userName)
        
    }
}
#4. Đặt chiến lược giải mã cho thuộc fullNametính
extension RawServerResponse: Decodable {
    init(from decoder: Decoder) throws {
        
        
        let realInfoKeysContainer = try userContainer.nestedContainer(keyedBy: RealInfoKeys.self, forKey: .realInfo)
        fullName = try realInfoKeysContainer.decode(String.self, forKey: .fullName)
        
    }
}
# 5. Đặt chiến lược giải mã cho thuộc reviewCounttính
extension RawServerResponse: Decodable {
    init(from decoder: Decoder) throws {
                
        
        var reviewUnkeyedContainer = try container.nestedUnkeyedContainer(forKey: .reviewCount)
        var reviewCountArray = [Int]()
        while !reviewUnkeyedContainer.isAtEnd {
            let reviewCountContainer = try reviewUnkeyedContainer.nestedContainer(keyedBy: ReviewCountKeys.self)
            reviewCountArray.append(try reviewCountContainer.decode(Int.self, forKey: .count))
        }
        guard let reviewCount = reviewCountArray.first else {
            throw DecodingError.dataCorrupted(DecodingError.Context(codingPath: container.codingPath + [RootKeys.reviewCount], debugDescription: "reviews_count cannot be empty"))
        }
        self.reviewCount = reviewCount
    }
}
Hoàn thành thực hiện
import Foundation
struct RawServerResponse {
    enum RootKeys: String, CodingKey {
        case id, user, reviewCount = "reviews_count"
    }
    enum UserKeys: String, CodingKey {
        case userName = "user_name", realInfo = "real_info"
    }
    enum RealInfoKeys: String, CodingKey {
        case fullName = "full_name"
    }
    enum ReviewCountKeys: String, CodingKey {
        case count
    }
    let id: Int
    let userName: String
    let fullName: String
    let reviewCount: Int
}
extension RawServerResponse: Decodable {
    init(from decoder: Decoder) throws {
        
        let container = try decoder.container(keyedBy: RootKeys.self)
        id = try container.decode(Int.self, forKey: .id)
        
        let userContainer = try container.nestedContainer(keyedBy: UserKeys.self, forKey: .user)
        userName = try userContainer.decode(String.self, forKey: .userName)
        
        let realInfoKeysContainer = try userContainer.nestedContainer(keyedBy: RealInfoKeys.self, forKey: .realInfo)
        fullName = try realInfoKeysContainer.decode(String.self, forKey: .fullName)
        
        var reviewUnkeyedContainer = try container.nestedUnkeyedContainer(forKey: .reviewCount)
        var reviewCountArray = [Int]()
        while !reviewUnkeyedContainer.isAtEnd {
            let reviewCountContainer = try reviewUnkeyedContainer.nestedContainer(keyedBy: ReviewCountKeys.self)
            reviewCountArray.append(try reviewCountContainer.decode(Int.self, forKey: .count))
        }
        guard let reviewCount = reviewCountArray.first else {
            throw DecodingError.dataCorrupted(DecodingError.Context(codingPath: container.codingPath + [RootKeys.reviewCount], debugDescription: "reviews_count cannot be empty"))
        }
        self.reviewCount = reviewCount
    }
}
Sử dụng
let jsonString = """
{
    "id": 1,
    "user": {
        "user_name": "Tester",
        "real_info": {
            "full_name":"Jon Doe"
        }
    },
    "reviews_count": [
    {
    "count": 4
    }
    ]
}
"""
let jsonData = jsonString.data(using: .utf8)!
let decoder = JSONDecoder()
let serverResponse = try! decoder.decode(RawServerResponse.self, from: jsonData)
dump(serverResponse)