Декодирование / анализ конкретного JSON с помощью Swift - PullRequest
0 голосов
/ 08 мая 2018

У меня много проблем при попытке декодировать этот JSON с помощью Swift 4.

{
    "Items": [
        {
            "id": 1525680450507,
            "animal": "bee",
            "type": "insect",
            "diet": [
                "a",
                "b",
                "c"
            ]
        }
    ],
    "Count": 1,
    "ScannedCount": 5
}

Здесь я пытаюсь расшифровать

let decoder = JSONDecoder()
let data = try decoder.decode([Animal].self, from: data)

Я создал такую ​​структуру

struct Animal: Codable {
    var id: Int
    var animal: String
    var type: String
    var diet: [String]
}

let decoder = JSONDecoder()
let data = try decoder.decode(ItemsResponse.self, from: data)

Это не работает. Я получаю сообщение об ошибке

"Предполагается декодировать массив <\ Any>, но вместо этого найден словарь."

Так что я подумал, может быть, мне нужно что-то вроде этого

struct ItemsResponse: Codable {
    var Items: [Animal]
    var Count: Int
    var ScannedCount: Int
}

Но это тоже не работает. Теперь я получаю

"Предполагается декодировать массив <\ Any>, но вместо этого найдена строка / данные."

Как мне создать структуру, которая будет декодировать этот JSON?

Ответы [ 2 ]

0 голосов
/ 08 мая 2018

Попробуйте это:

import Foundation

let json = """
{
    "Items": [
        {
            "id": 1525680450507,
            "animal": "bee",
            "type": "insect",
            "diet": [
                "a",
                "b",
                "c"
            ]
        }
    ],
    "Count": 1,
    "ScannedCount": 5
}
"""

struct Animal: Codable {
    var id: Int
    var animal: String
    var type: String
    var diet: [String]
}

struct ItemsResponse: Codable {
    var Items: [Animal]
    var Count: Int
    var ScannedCount: Int
}

let data = try! JSONDecoder().decode(ItemsResponse.self, from: json.data(using: .utf8)!)

Конечно, вы должны правильно обрабатывать возможные сбои (т.е. не делать try! и не выполнять принудительное развертывание части json.data()!)

Но приведенный выше код работает и, надеюсь, ответит на ваш вопрос.

0 голосов
/ 08 мая 2018
let data = try decoder.decode([Animal].self, from: data)

[Animal].self неверно, вы можете использовать его так:

struct DataJson: Codable {
    let items: [Item]
    let count, scannedCount: Int

    enum CodingKeys: String, CodingKey {
        case items = "Items"
        case count = "Count"
        case scannedCount = "ScannedCount"
    }
}

struct Item: Codable {
    let id: Int
    let animal, type: String
    let diet: [String]
}

// MARK: Convenience initializers

extension DataJson {
    init(data: Data) throws {
        self = try JSONDecoder().decode(DataJson.self, from: data)
    }



    func jsonData() throws -> Data {
        return try JSONEncoder().encode(self)
    }

    func jsonString(encoding: String.Encoding = .utf8) throws -> String? {
        return String(data: try self.jsonData(), encoding: encoding)
    }
}

extension Item {
    init(data: Data) throws {
        self = try JSONDecoder().decode(Item.self, from: data)
    }


    func jsonData() throws -> Data {
        return try JSONEncoder().encode(self)
    }

    func jsonString(encoding: String.Encoding = .utf8) throws -> String? {
        return String(data: try self.jsonData(), encoding: encoding)
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...