Swift macOS: Считывание файла JSON в словарь. Во время процесса преобразуйте строки в даты, а затем отсортируйте по дате

#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 в a Date в вашей getData() функции

Ответ №1:

После некоторых исследований и тестирования я бы согласился с тем, что словари не предназначены для заказа. Итак, я изменил файл JSON, как показано ниже. С помощью этой модификации одной строки я смог создать инициализацию и преобразовать строку в дату. Спасибо вам за ответы.

Крис

 { "Time Series Data" : {
    "20200921": {
        "NAV": 173.67997
    },
    "20200922": {
        "NAV": 175.49292
    },