#json #swift #dictionary
Вопрос:
У меня есть программа swift, которая считывает данные на складе в формате JSON из нескольких файлов. Один такой файл содержит строковую дату и связанную пару значений ключа. Если бы был ключ для даты строки, я мог бы создать структуру с инициализацией. Приведенный ниже код позволяет мне прочитать файл в словаре, но в итоге я получаю строку, в которой мне нужна дата. Кроме того, единственный способ, которым я знаю, как сортировать, — это сначала сопоставить пару значений ключа, которая создает массив. Любой вклад, который укажет мне правильное направление, будет оценен по достоинству. Ниже приведен фрагмент файла JSON и код, который я использую для его чтения в словаре.
С уважением,
Крис
{
"20200921": {
"NAV": 173.67997
},
"20200922": {
"NAV": 175.49292
},
"20200923": {
"NAV": 171.35833
},
struct TimeSeriesValue: Decodable {
let value : Double
enum CodingKeys: String, CodingKey {
case value = "NAV"
}
}
class getTimeSeriesData: ObservableObject {
@Published var tmpData : [String:TimeSeriesValue] = [:]
init() {
getData()
}
func getData() {
guard let url = Bundle.main.url(forResource: "JSONDataPrincipal", withExtension: "json")
else {
print("Json file not found")
return
}
let decoder = JSONDecoder()
do {
let data = try Data(contentsOf: url)
self.tmpData = try decoder.decode([String:TimeSeriesValue].self, from: data)
} catch {
print(error)
}
}
}
struct JSONModelPrincipal {
@ObservedObject var prinJSONData = getTimeSeriesData()
}
Комментарии:
1. В вашем дереве JSON отсутствует закрытая фигурная скобка.
2. Словари не упорядочены, поэтому они сопоставляются с массивом. Поэтому вы, вероятно, не захотите использовать словарь, если вам нужно его заказать. И здесь вы мало что можете сделать, вам нужно использовать словарь. Но ничто не мешает вам преобразовать ваш
String
в aDate
в вашейgetData()
функции
Ответ №1:
После некоторых исследований и тестирования я бы согласился с тем, что словари не предназначены для заказа. Итак, я изменил файл JSON, как показано ниже. С помощью этой модификации одной строки я смог создать инициализацию и преобразовать строку в дату. Спасибо вам за ответы.
Крис
{ "Time Series Data" : {
"20200921": {
"NAV": 173.67997
},
"20200922": {
"NAV": 175.49292
},