Swift 4 Ошибка сериализации json typeMismatch - PullRequest
0 голосов
/ 28 ноября 2018

Я пытаюсь проанализировать данные из статического файла JSON для своих сущностей, но получаю следующую ошибку: Error serializing json typeMismatch

Идея заключается в создании приложения для сбора формул.Коллекция формул должна загружаться каждый раз, когда приложение запускается при загрузке JSON.Таким образом, проще обновить список формул.

Я предполагаю, что JSON объясняет предполагаемую структуру данных.

Мой JSON:

[
    {
        "category_name": "Wasserbau",
        "icon": "wave",
        "formula_list": [
            {
                "formula_name": "Formel 1",
                "formula_description": "Demo Formel für Testat",
                "formula": "x=y/z",
                "favorite": false
            },
            {
                "formula_name": "Formel 2",
                "formula_description": "Demo Formel für Testat",
                "formula": "x=y/z",
                "favorite": false
            }
        ]
    },
    {
        "category_name": "Strassenbau",
        "icon": "wave",
        "formula_list": [
            {
                "formula_name": "Formel 3",
                "formula_description": "Demo Formel für Testat",
                "formula": "x=y/z",
                "favorite": false
            },
            {
                "formula_name": "Formel 4",
                "formula_description": "Demo Formel für Testat",
                "formula": "x=y/z",
                "favorite": false
            }
        ]
    },
    {
        "category_name": "Hochbau",
        "icon": "wave",
        "formula_list": [
            {
                "formula_name": "Formel 5",
                "formula_description": "Demo Formel für Testat",
                "formula": "x=y/z",
                "favorite": false
            },
            {
                "formula_name": "Formel 6",
                "formula_description": "Demo Formel für Testat",
                "formula": "x=y/z",
                "favorite": false
            }
        ]
    }
]

Функция, в которой я пытаюсьРазобрать JSON:

 func loadCategoryJSONData() {
        let jsonUrlString = "https://joshuahemmings.ch/data.json"

        guard let url = URL(string: jsonUrlString) else {return} //
        URLSession.shared.dataTask(with: url) { (data, response, err) in
            guard let data = data else {return}
            print("JSON Response: ")
            print(data)
            do {
                let categoryJSONData =  try JSONDecoder().decode(CategoryList.self, from: data)
                for category in categoryJSONData.data {
                    print(category.categoryName)
                }
            } catch let jsonErr {
                print("Error serializing json", jsonErr)
            }
            }.resume()
    }

И мои сущности:

struct CategoryList: Decodable {
        let data: [Category]
    }

    struct Formula: Codable {
        let formulaName : String
        let formulaDescription : String
        let formula : String
        let favorite: Bool

        enum CodingKeys: String, CodingKey {
            case formulaName = "formula_name"
            case formulaDescription = "formula_description"
            case formula
            case favorite
        }
        init(_ dictionary: [String: Any]) {
            self.formulaName = dictionary["formulaName"] as? String ?? ""
            self.formulaDescription = dictionary["formulaDescription"] as? String ?? ""
            self.formula = dictionary["formula"] as? String ?? ""
            self.favorite = dictionary["favorite"] as? Bool ?? false
        }
    }

    struct Category: Codable {
        let categoryName: String
        let icon: String
        let formulaList: [Formula]

        enum CodingKeys: String, CodingKey {
            case categoryName = "category_name"
            case icon = "icon"
            case formulaList = "formula_list"
        }

        init(_ dictionary: [String: Any]) {
            self.categoryName = dictionary["categoryName"] as? String ?? ""
            self.icon = dictionary["icon"] as? String ?? ""
            self.formulaList = dictionary["formulaList"] as? [Formula] ?? []
        }
    }

1 Ответ

0 голосов
/ 28 ноября 2018

Ваша основная проблема в объявлении типа для разбора этого JSON.

У вас нет CategoryList здесь, это было бы что-то вроде:

{
    "data": [ … <Category JSON> … ]
}

Вы 'здесь просто [Category], как у корня JSON Array ([]), а не Object ({}).

Так что вместо

try decoder.decode(CategoryList.self, from: data)

Выдолжен делать

try decoder.decode([Category].self, from: data)

Кроме того, если ваши ключи кодирования почти такие же, как ключи в JSON, но не в случае змеи, вы не должны объявлять пользовательский CodingKey для вашего типа.Вместо этого используйте правильный .keyDecodingStrategy .

struct Formula: Codable {
    let formulaName: String
    let formulaDescription: String
    let formula: String
    let favorite: Bool
}

struct Category: Codable {
    let categoryName: String
    let icon: String
    let formulaList: [Formula]
}

let decoder = JSONDecoder()
decoder.keyDecodingStrategy = .convertFromSnakeCase
let categoryJSONData =  try decoder.decode([Category].self, from: data)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...