Swift Decode JSON со смешанными типами и возможными подструктурами

Создайте публичную функцию, описанную здесь здесь :

Public Function GetUserName() As String
    ' GetUserName = Environ("USERNAME")
    ' Environ("USERNAME") is easily spoofed, see comment by HansUp
    GetUserName = CreateObject("WScript.Network").UserName
End Function

, и используйте =GetUserName() в качестве значения по умолчанию для элемента управления.

1
задан ygosteli 16 January 2019 в 14:17
поделиться

2 ответа

используйте эту структуру

struct YourStruct: Codable {
    let menuName: String
    let menuID: Int
    let menuGroups: [MenuGroup]

    enum CodingKeys: String, CodingKey {
        case menuName
        case menuID = "menuId"
        case menuGroups
    }
}

struct MenuGroup: Codable {
    let type, name: String
    let menuEntry: [MenuGroupMenuEntry]
}

struct MenuGroupMenuEntry: Codable {
    let type: String
    let name: String?
    let menuEntry: [MenuEntryMenuEntry]?
    let productName, productPrice: String?
}

struct MenuEntryMenuEntry: Codable {
    let type, productName, productPrice: String
}

и в datatask после проверки, что у вас нет ошибки

if let data = data {
                let decoder = JSONDecoder()
                guard let decodedJson = try? decoder.decode(YourStruct.self, from: data) else { completion(nil) ; return }

            }

надеюсь, что эта помощь

0
ответ дан teodik abrami 16 January 2019 в 14:17
поделиться

Вы очень, очень близки и хорошо поработали над проектированием ваших структур данных. Вам просто нужно попытаться декодировать каждую возможную опцию в CategoryItem.

public init(from decoder: Decoder) throws {
    let container = try decoder.singleValueContainer()
    if let item = try? container.decode(MenuCategory.self) {
        self = .group(item)
    } else if let item = try? container.decode(MenuItem.self) {
        self = .menuItem(item)
    } else {
        throw DecodingError.dataCorrupted(.init(codingPath: decoder.codingPath,
                                                debugDescription: "Not a group or item"))
    }
}

Этот контейнер является контейнером с одним значением, потому что на этом этапе декодирования вы декодируете только одну вещь, группу или элемент. Каждый из этих отдельных значений должен обрабатывать свои подкомпоненты.

0
ответ дан Rob Napier 16 January 2019 в 14:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: