Давайте посмотрим на ваш желаемый формат в «симпатичном» формате:
{
"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])
})