无法弄清楚如何通过编码获取所有新的json数据

时间:2019-10-03 20:51:53

标签: json swift codable

我尝试弄乱了codables,并且正在使用QuickType格式化所有结构。但是,Stats的数据将不断更改为添加新内容。因此,可以说存在杀人和获胜杀人,后来的爆头被添加到类别中。目前,我无法仅将这些数据放入每个特定图例的数组中。现在,我只能单独访问变量,因此,我将不得不不断更改代码以获取新内容。与数组一样,我可以将其设置为tableView并保留它。

我尝试使用

 print(store.data.segments.map{$0.stats.carePackageKills?.displayName}[2])

但是,这只给我一个结果,或者如果我删除[2],那么我将获得针对该特定类别的“ carePackageKills”的所有结果。 我想要的是将所有统计信息放入特定图例的数组中,但是api似乎不允许这样做?

结构:

// MARK:-存储     struct商店:可编码{         让数据:DataClass

    enum CodingKeys: String, CodingKey {
        case data = "data"
    }
}

// MARK: - DataClass
struct DataClass: Codable {
    let platformInfo: PlatformInfo
    let userInfo: UserInfo
    let metadata: DataMetadata
    let segments: [Segment]
    let availableSegments: [AvailableSegment]
    //let expiryDate: ExpiryDate

    enum CodingKeys: String, CodingKey {
        case platformInfo = "platformInfo"
        case userInfo = "userInfo"
        case metadata = "metadata"
        case segments = "segments"
        case availableSegments = "availableSegments"
        //case expiryDate = "expiryDate"
    }
}

// MARK: - AvailableSegment
struct AvailableSegment: Codable {
    let type: TypeEnum
    let attributes: MetadataClass

    enum CodingKeys: String, CodingKey {
        case type = "type"
        case attributes = "attributes"
    }
}

// MARK: - MetadataClass
struct MetadataClass: Codable {
}

enum TypeEnum: String, Codable {
    case legend = "legend"
    case overview = "overview"
}



// MARK: - DataMetadata
struct DataMetadata: Codable {
    let currentSeason: Int
    let activeLegend: String
    let activeLegendName: String

    enum CodingKeys: String, CodingKey {
        case currentSeason = "currentSeason"
        case activeLegend = "activeLegend"
        case activeLegendName = "activeLegendName"
    }
}

// MARK: - PlatformInfo
struct PlatformInfo: Codable {
    let platformSlug: String
    let platformUserId: String
    let platformUserHandle: String
    let platformUserIdentifier: String
    let avatarUrl: String
    let additionalParameters: JSONNull?

    enum CodingKeys: String, CodingKey {
        case platformSlug = "platformSlug"
        case platformUserId = "platformUserId"
        case platformUserHandle = "platformUserHandle"
        case platformUserIdentifier = "platformUserIdentifier"
        case avatarUrl = "avatarUrl"
        case additionalParameters = "additionalParameters"
    }
}

// MARK: - Segment
struct Segment: Codable {
    let type: TypeEnum
    let attributes: SegmentAttributes
    let metadata: SegmentMetadata
   // let expiryDate: ExpiryDate
    let stats: Stats

    enum CodingKeys: String, CodingKey {
        case type = "type"
        case attributes = "attributes"
        case metadata = "metadata"
        //case expiryDate = "expiryDate"
        case stats = "stats"
    }
}

// MARK: - SegmentAttributes
struct SegmentAttributes: Codable {
    let id: String?

    enum CodingKeys: String, CodingKey {
        case id = "id"
    }
}

// MARK: - SegmentMetadata
struct SegmentMetadata: Codable {
    let name: String
    let imageUrl: String?
    let tallImageUrl: String?
    let bgImageUrl: String?
    let isActive: Bool?

    enum CodingKeys: String, CodingKey {
        case name = "name"
        case imageUrl = "imageUrl"
        case tallImageUrl = "tallImageUrl"
        case bgImageUrl = "bgImageUrl"
        case isActive = "isActive"
    }
}

// MARK: - Stats
struct Stats: Codable {
    let level: ArKills?
    let kills: ArKills
    let damage: ArKills?
    let headshots: ArKills?
    let finishers: ArKills?
    let arKills: ArKills?
    let carePackageKills: ArKills?
    let seasonWins: ArKills?
    let seasonKills: ArKills?
    let season2Wins: ArKills?
    let rankScore: RankScore?
    let smokeGrenadeEnemiesHit: ArKills?
    let eyeEnemiesScanned: ArKills?
    let grappleTravelDistance: ArKills?

    enum CodingKeys: String, CodingKey {
        case level = "level"
        case kills = "kills"
        case damage = "damage"
        case headshots = "headshots"
        case finishers = "finishers"
        case arKills = "arKills"
        case carePackageKills = "carePackageKills"
        case seasonWins = "seasonWins"
        case seasonKills = "seasonKills"
        case season2Wins = "season2Wins"
        case rankScore = "rankScore"
        case smokeGrenadeEnemiesHit = "smokeGrenadeEnemiesHit"
        case eyeEnemiesScanned = "eyeEnemiesScanned"
        case grappleTravelDistance = "grappleTravelDistance"
    }
}

// MARK: - ArKills
struct ArKills: Codable {
    let rank: Int?
    let percentile: Double?
    let displayName: String
    let displayCategory: DisplayCategory
    let category: JSONNull?
    let metadata: MetadataClass
    let value: Double
    let displayValue: String
    let displayType: DisplayType

    enum CodingKeys: String, CodingKey {
        case rank = "rank"
        case percentile = "percentile"
        case displayName = "displayName"
        case displayCategory = "displayCategory"
        case category = "category"
        case metadata = "metadata"
        case value = "value"
        case displayValue = "displayValue"
        case displayType = "displayType"
    }
}

enum DisplayCategory: String, Codable {
    case combat = "Combat"
    case game = "Game"
    case weapons = "Weapons"
}

enum DisplayType: String, Codable {
    case unspecified = "Unspecified"
}

// MARK: - RankScore
struct RankScore: Codable {
    let rank: JSONNull?
    let percentile: Int
    let displayName: String
    let displayCategory: DisplayCategory
    let category: JSONNull?
    let metadata: RankScoreMetadata
    let value: Int
    let displayValue: String
    let displayType: DisplayType

    enum CodingKeys: String, CodingKey {
        case rank = "rank"
        case percentile = "percentile"
        case displayName = "displayName"
        case displayCategory = "displayCategory"
        case category = "category"
        case metadata = "metadata"
        case value = "value"
        case displayValue = "displayValue"
        case displayType = "displayType"
    }
}

// MARK: - RankScoreMetadata
struct RankScoreMetadata: Codable {
    let iconUrl: String

    enum CodingKeys: String, CodingKey {
        case iconUrl = "iconUrl"
    }
}

// MARK: - UserInfo
struct UserInfo: Codable {
    let isPremium: Bool
    let isVerified: Bool
    let isInfluencer: Bool
    let countryCode: String
    let customAvatarUrl: JSONNull?
    let socialAccounts: JSONNull?

    enum CodingKeys: String, CodingKey {
        case isPremium = "isPremium"
        case isVerified = "isVerified"
        case isInfluencer = "isInfluencer"
        case countryCode = "countryCode"
        case customAvatarUrl = "customAvatarUrl"
        case socialAccounts = "socialAccounts"
    }
}

// MARK: - Encode/decode helpers

class JSONNull: Codable, Hashable {

    public static func == (lhs: JSONNull, rhs: JSONNull) -> Bool {
        return true
    }

    public var hashValue: Int {
        return 0
    }

    public func hash(into hasher: inout Hasher) {
        // No-op
    }

    public init() {}

    public required init(from decoder: Decoder) throws {
        let container = try decoder.singleValueContainer()
        if !container.decodeNil() {
            throw DecodingError.typeMismatch(JSONNull.self, DecodingError.Context(codingPath: decoder.codingPath, debugDescription: "Wrong type for JSONNull"))
        }
    }

    public func encode(to encoder: Encoder) throws {
        var container = encoder.singleValueContainer()
        try container.encodeNil()
    }
} 

调用API

let PlayerStatURL = URL(string: "https://public-api.tracker.gg/v2/apex/standard/profile/origin/itsspress")

        if let unwrappedURL = PlayerStatURL {
            var request = URLRequest(url: unwrappedURL)
            request.addValue("db833c37-1f45-4be4-a670-38272dba7504", forHTTPHeaderField: "TRN-Api-Key")
            let dataTask = URLSession.shared.dataTask(with: request) { (data, response, error) in
                // you should put in error handling code, too
                if let data = data {
                    do {


                        let store = try JSONDecoder().decode(Store.self, from: data) as Store

                        print(store.data.platformInfo.avatarUrl)
                        print(store.data.platformInfo.platformUserHandle)
                        print("Level: \(store.data.segments[0].stats.level!.displayValue)")

                        print("lifetime Kills: \(store.data.segments.map{$0.stats.kills.displayValue}[0])")

                        print(store.data.segments.map{$0.metadata.name})
                        print(store.data.segments.map{$0.stats.carePackageKills?.displayName}[2])


                    } catch {
                        print(error.localizedDescription)
                        print(error)

                        }
                    }
                }
            dataTask.resume()

        } 

我希望能够打印图例名称以及每个“ stats” diplayName和DisplayValue。目前,我只能获得单独的名称和值,并且必须将它们分别指定。那会马虎。

我希望能够将DisplayName和DisplayValue放入数组,以便可以将它们分配给不同的图例。然后,如果曾经添加数据,则阵列将仅具有更多数据并将其添加到关联的图例中。

0 个答案:

没有答案