Попытка разобрать json для publi c git репозиториев в быстром темпе, но при получении "Ожидается расшифровка словаря" но нашел вместо этого массив. " - PullRequest
0 голосов
/ 18 января 2020

My json выглядит следующим образом:

[
{
    "name": "sensei",
    "owner": {
        "login": "linkedin",
    },
    "description": "distributed realtime searchable database",
    "fork": false,
},
{
    "name": "linkedin-utils",
    "owner": {
        "login": "linkedin",
    },
    "description": "Base utilities shared by all linkedin open source projects",
    "fork": false,
}
]

Я построил следующие структуры:

    struct LinkedinData: Codable {
    var name: String
    var description: String
        var owner: OwnerLogin
        var fork: Bool
    }



  struct OwnerLogin: Codable {
        var login: String
    }

Мой код для разбора:

    import UIKit

class ViewController: UIViewController {

    var linkedinData = [LinkedinData]()


    override func viewDidLoad() {
        super.viewDidLoad()

        let urString : String = "https://api.github.com/orgs/linkedin/repos"

                if let url = URL(string: urString) {
                    let session = URLSession(configuration: .default)
                    let task = session.dataTask(with: url) { (data, response, error) in
                        if error != nil {
                            print(error!)
                            return //exit out of function
                        }
                        parseJSON(json: data!)

                    }
                    task.resume()
                }

            func parseJSON(json: Data) {
                let decoder = JSONDecoder()
                if let decodedData = try? decoder.decode(LinkedinData.self, from: json) {
                    linkedinData = [decodedData]

                }
            }

        }

Я пытался часами, но кажется, что невозможно проанализировать json и получить искомые данные (имя, описание, owner.login и fork) в виде коллекции. Не могли бы вы помочь?

Ответы [ 2 ]

2 голосов
/ 18 января 2020

Вы должны декодировать массив LinkedinData вместо одного, потому что ваш JSON имеет массив как root:

[ <------- this "[" indicates an array
{
    "name": "sensei",
    "owner": {
        "login": "linkedin",
    },

Поэтому вы должны написать:

if let decodedData = try? decoder.decode([LinkedinData].self, from: json) {
    linkedinData = decodedData

}
1 голос
/ 18 января 2020
if let decodedData = try? decoder.decode(LinkedinData.self, from: json) {
     linkedinData = [decodedData]
}

замените это на

 if let decodedData = try? decoder.decode([LinkedinData].self, from: json) {
     linkedinData = decodedData
 }

, поскольку ваш самый верхний объект в JSON является массивом.

...