从JSON API追加到数组中

时间:2018-06-09 16:15:43

标签: ios arrays swift uiviewcontroller swift4

如何使用JSON Model Class追加到数组中。 这是我的JSON API请求:§5.1.3

byte

在这里,我有我的班级模型,我说的是我要从该回复中提取的内容:

char

现在,当我尝试将所有自定义属性追加到我的数组中时,我陷入困境,因为shortimport Foundation typealias GitDecode = [GitDecodeElement] struct GitDecodeElement: Codable { let totalCount: Int let incompleteResults: Bool let items: [Item] enum CodingKeys: String, CodingKey { case totalCount = "total_count" case incompleteResults = "incomplete_results" case items } } struct Item: Codable { let id: Int let nodeID, name, fullName: String let owner: Owner let itemPrivate: Bool let htmlURL, description: String let fork: Bool let url, createdAt, updatedAt, pushedAt: String let homepage: String let size, stargazersCount, watchersCount: Int let language: String let forksCount, openIssuesCount: Int let masterBranch, defaultBranch: String let score: Double enum CodingKeys: String, CodingKey { case id case nodeID = "node_id" case name case fullName = "full_name" case owner case itemPrivate = "private" case htmlURL = "html_url" case description, fork, url case createdAt = "created_at" case updatedAt = "updated_at" case pushedAt = "pushed_at" case homepage, size case stargazersCount = "stargazers_count" case watchersCount = "watchers_count" case language case forksCount = "forks_count" case openIssuesCount = "open_issues_count" case masterBranch = "master_branch" case defaultBranch = "default_branch" case score } } struct Owner: Codable { let login: String let id: Int let nodeID, avatarURL, gravatarID, url: String let receivedEventsURL, type: String enum CodingKeys: String, CodingKey { case login, id case nodeID = "node_id" case avatarURL = "avatar_url" case gravatarID = "gravatar_id" case url case receivedEventsURL = "received_events_url" case type } } import Foundation struct Git: Codable{ let totalCount: Int let items: GitItem init ( totalCount: Int, itemID: Int, itemDescription: String, ownerID: Int, ownerAvatarURL: String) { self.totalCount = totalCount self.items = GitItem(id: itemID, description: itemDescription, owner: GitOwner(id: ownerID, avatarURL: ownerAvatarURL)) } } struct GitItem: Codable{ let id: Int let description: String let owner: GitOwner } struct GitOwner: Codable { let id: Int let avatarURL: String } itemID位于不同的类中。< / p>

以下是我尝试使用JSONDecoder从JSON获取所有属性的方法:

itemDescription

2 个答案:

答案 0 :(得分:2)

完成工作游乐场代码:

针对Swift相关回购的API进行搜索。

解析它们,将它们添加到数组中并打印出每个数据的一些基本信息。 (fullName,name,avatarUrl

//: Playground - noun: a place where people can play
import PlaygroundSupport
import UIKit

struct GitDecodeElement: Codable {
    let totalCount: Int
    let incompleteResults: Bool
    let items: [Repo]

    enum CodingKeys: String, CodingKey {
        case totalCount = "total_count"
        case incompleteResults = "incomplete_results"
        case items
    }
}

struct Repo: Codable {
    let id: Int
    let nodeID, name, fullName: String
    let owner: Owner
    let itemPrivate: Bool
    let htmlURL, description: String
    let fork: Bool
    let url, createdAt, updatedAt, pushedAt: String
    let homepage: String?
    let size, stargazersCount, watchersCount: Int
    let language: String?
    let forksCount, openIssuesCount: Int
    let score: Double

    enum CodingKeys: String, CodingKey {
        case id
        case nodeID = "node_id"
        case name
        case fullName = "full_name"
        case owner
        case itemPrivate = "private"
        case htmlURL = "html_url"
        case description, fork, url
        case createdAt = "created_at"
        case updatedAt = "updated_at"
        case pushedAt = "pushed_at"
        case homepage, size
        case stargazersCount = "stargazers_count"
        case watchersCount = "watchers_count"
        case language
        case forksCount = "forks_count"
        case openIssuesCount = "open_issues_count"
        case score
    }
}

struct Owner: Codable {
    let login: String
    let id: Int
    let nodeID, avatarURL, gravatarID, url: String
    let receivedEventsURL, type: String

    enum CodingKeys: String, CodingKey {
        case login, id
        case nodeID = "node_id"
        case avatarURL = "avatar_url"
        case gravatarID = "gravatar_id"
        case url
        case receivedEventsURL = "received_events_url"
        case type
    }
}



var gitRepositoriesArray = [Repo]()

// Download Git Repositories from API
func parseGitRepositories() {

    let url = URL(string: "https://api.github.com/search/repositories?q=topic:swift+topic:ios")
    var request = URLRequest(url: url!)
    request.addValue("application/json", forHTTPHeaderField: "Content-Type")
    request.addValue("application/json", forHTTPHeaderField: "Accept")

    URLSession.shared.dataTask(with: request) { (data, response, error) in

        guard error == nil else {
            print(error?.localizedDescription)
            return
        }

        do {
            let gitRepositoriesList = try JSONDecoder().decode(GitDecodeElement.self, from: data!)

            gitRepositoriesArray = gitRepositoriesArray + gitRepositoriesList.items
            print(gitRepositoriesArray.count)

            for repo in gitRepositoriesList.items {
                print("\(repo.fullName) - \(repo.name) - \(repo.owner.avatarURL)")
            }

        } catch {
            let str = String(data: data!, encoding: .utf8)
            print(str)
            print(error)
        }

    }.resume()
}

parseGitRepositories()

PlaygroundPage.current.needsIndefiniteExecution = true

<强>输出:

30

justjavac/free-programming-books-zh_CN - free-programming-books-zh_CN - https://avatars1.githubusercontent.com/u/359395?v=4
dkhamsing/open-source-ios-apps - open-source-ios-apps - https://avatars0.githubusercontent.com/u/4723115?v=4
matteocrippa/awesome-swift - awesome-swift - https://avatars2.githubusercontent.com/u/475463?v=4
xitu/gold-miner - gold-miner - https://avatars2.githubusercontent.com/u/10482599?v=4
lkzhao/Hero - Hero - https://avatars1.githubusercontent.com/u/3359850?v=4
ReactiveX/RxSwift - RxSwift - https://avatars1.githubusercontent.com/u/6407041?v=4
realm/realm-cocoa - realm-cocoa - https://avatars0.githubusercontent.com/u/7575099?v=4
CocoaPods/CocoaPods - CocoaPods - https://avatars1.githubusercontent.com/u/1189714?v=4
CosmicMind/Material - Material - https://avatars1.githubusercontent.com/u/10069574?v=4
// rest truncated 

请注意我使用的模型少于您在代码中使用的模型。无需重复代码,只需在需要时使用所需的部件即可。

答案 1 :(得分:0)

Git结构存在一些问题。我已经纠正了这样的初始化程序:

struct Git: Codable{

let totalCount: Int
var items = [GitItem]()

init(totalCount: Int, items: [Item]) {
    self.totalCount = totalCount

    for item in items {
        self.items.append(GitItem(id: item.id, description: item.description, owner: GitOwner(id: item.owner.id, avatarURL: item.owner.avatarURL)))
    }

}

因此,您的解析方法将相应更改:

    // Download Git Repositories from API
func parseGitRepositories(){

    let url = URL(string: "https://api.github.com/search/repositories?q=tetris+language:assembly&sort=stars&order=desc")
    URLSession.shared.dataTask(with: url!) { (data, response, error) in
        if error == nil{
            do{
                let gitRepositoriesList = try JSONDecoder().decode(GitDecode.self, from: data!)
                for eachRepo in gitRepositoriesList{
                    self.gitRepositoriesArray.append(Git(totalCount: eachRepo.totalCount, items: eachRepo.items))
                }

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

另请注意将网址更改为https://api.github.com/search/repositories?q=tetris+language:assembly&sort=stars&order=desc。您在代码中使用的当前URL只是带有示例的html页面。它没有返回正确的json结果。