Swift Codable: кодировать структуру с помощью динамических клавиш - PullRequest
0 голосов
/ 11 декабря 2018

Я хочу иметь следующую структуру JSON (поддельный пример):

{
    "Admin" : 
    {
        "name" : "John",
        "age" : "42"
    },
    "Sales" : 
    {
        "name" : "John",
        "age" : "42"
    },
    "CEO" : 
    {
        "name" : "Peter",
        "age" : "52",
        "salary" : "100000"
    },
    "Janitor" : 
    {
        "name" : "Matthew",
        "age" : "22"
    }
}

Как видите, структура определена, но имя структуры является динамическим.

Как я могу преобразовать это в Swift Codable структуру?Текущая попытка:

struct Positions: Codable
{
    var posDicts: [String: Position] = [:]
}

struct Position: Codable
{
    let name: String
    let age: Int
    let salary: Int?
}

Однако это даст следующее:

"posDicts" : {
    "Admin" : 
    {
        "name" : "John",
        "age" : "42"
    },
    "Sales" : 
    {
        "name" : "John",
        "age" : "42"
    },
    "CEO" : 
    {
        "name" : "Peter",
        "age" : "52",
        "salary" : "100000"
    },
    "Janitor" : 
    {
        "name" : "Matthew",
        "age" : "22"
    }
}

Я не хочу "posDicts" в JSON.Что было бы лучшим / самым простым решением?

PS: связанный вопрос о декодируемом Swift Codable с динамическими клавишами

Ответы [ 2 ]

0 голосов
/ 11 декабря 2018

Ответ Vadian - хороший толчок в правильном направлении.Решение состояло в том, чтобы закодировать словарь вместо структуры, содержащей словарь.

Поскольку первоначальный вопрос касается кодирования, следующее решение является полным:

var positions: [String: Position] = [:]
let json = try? encoder.encode(positions)
0 голосов
/ 11 декабря 2018

Вместо декодирования

let result = try JSONDecoder().decode(Positions.self, from: data)

удалить структуру Positions и декодировать

let result = try JSONDecoder().decode([String:Position].self, from: data)

Для кодирования словаря, соответственно, объявите его как

 var positions = [String:Position]()
...