Другой json формат для кодирования Swift - PullRequest
0 голосов
/ 31 марта 2020

Я пытаюсь подготовить данные для JSON Кодировать:

var i = 0
for (data) in students {
    var variableNewData = ["\(students[i].id)":["timestampValue":"\(students[i].timestampValue)"]]
    variableNewData["updateTime"] = ["updateTime":"\(students[i].timestampValue)"]
    variableNewData["createTime"] = ["createTime":"\(students[i].timestampValue)"]
    i += 1

    let finalParameter = ["class":variableNewData]
    print("LastParameter:",finalParameter)}
}

Мне нужны данные в этом формате:

{"class": {"studentOne": {"timestampValue": "2020-02-04" },"studentTwo ":{ "timestampValue": "2020-02-05" }},"createTime": "2020-03-30","updateTime": "2020-03-30"}

, но я получаю это: class, id, timestampValue похоже хорошо, но время создания и обновления неверно. спасибо за любые предложения.

{"class":{"createTime":{"createTime":"2020-03-30"},"studentOne":{"timestampValue":"2020-02-04"},"updateTime":{"createTime":"2020-03-30"}}}

Ответы [ 2 ]

1 голос
/ 31 марта 2020

Давайте посмотрим на ваш желаемый формат в «симпатичном» формате:

{
    "class": {
        "studentOne": {
            "timestampValue": "2020-02-04"
        },
        "studentTwo ": {
            "timestampValue": "2020-02-05"
        }
    },
    "createTime": "2020-03-30",
    "updateTime": "2020-03-30"
}

Итак, для ключа class у вас есть значение, которое является субдискретным ключом с идентификатором студента, которое само по себе содержит еще один словарь с одной отметкой времени. Итак, я бы построил этот словарь, связанный с class first:

var studentsDictionary: [String: [String: String]] = [:]
for student in students {
    studentsDictionary[student.id] = ["timestampValue": student.timestampValue]
}

Затем у вас есть createTime и updateTime, которые находятся на верхнем уровне, наряду с class (предположительно данные создание и обновление всего класса, а не отдельных учащихся). В любом случае вы можете создать словарь верхнего уровня, например так:

let dictionary: [String: Any] = [
    "class": studentsDictionary,
    "updateTime": "2020-02-05",
    "createTime": "2020-02-05"
]

Очевидно, вы захотите установить updateTime и createTime для значений меток времени для класса, но, надеюсь, это иллюстрирует идею.

И тогда мы можем построить JSON представление всего этого с помощью:

let data = try! JSONSerialization.data(withJSONObject: dictionary) // add `option: .prettyPrinted` if you want to see pretty version

//
// if you want to check the above `data`:
//
// let string = String(data: data, encoding: .utf8)!
// print(string)
//

Обратите внимание, что updateTime и createTime не на уровне ученика, поэтому Я не уверен, откуда вы хотели получить эти значения.


Кстати, если вам интересно, более краткий способ построить этот словарь studentDictionary с помощью Dictionary(uniqueKeysWithValues:) :

let studentsDictionary = Dictionary(uniqueKeysWithValues: students.map { student in
    (student.id, ["timestampValue": student.timestampValue])
})
0 голосов
/ 31 марта 2020

Попробуйте установить значения ключей updateTime и createTime в виде простых строк вместо собственных словарей.

variableNewData["updateTime"] = "\(students[i].timestampValue)"
variableNewData["createTime"] = "\(students[i].timestampValue)"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...