Swift - загрузить / разобрать JSON файл - PullRequest
0 голосов
/ 09 марта 2020

У меня есть json файл:

{
  "fields": {
    "123456": {
      "timestampValue": "2019-03-05T23:00:00Z"
    },
    "7895": {
      "timestampValue": "2019-03-02T23:00:00Z"
    }
  },
  "createTime": "2019-03-08T00:14:55.357221Z",
  "updateTime": "2019-03-08T17:22:08.398718Z"
}

, и мне нужно получить следующие значения:

"123456"   "timestampValue": "2019-03-05T23:00:00Z"
"7895" "timestampValue": "2019-03-02T23:00:00Z"

Мой код в файле DataLoader.swift:

import Foundation

public class DataLoader
{
    @Published var userData = [UserData]()

  init()
  {
    load()
    //sort()
  }

  func load()
  {

    if let fileLocation = Bundle.main.url(forResource: "mydata", withExtension: "json")
    {
      do
      {
        let data = try Data(contentsOf: fileLocation)

        let jsonDecoder = JSONDecoder()
        let dataFromJson = try jsonDecoder.decode([UserData].self, from: data)
        self.userData = dataFromJson  
      }
      catch
      {
        print(error)
      } 
    }
  }
}

Мой код в файле UserData.swift:

import Foundation

struct UserData: Codable
{

    var timestampValue: Date = Date()
    var fields: String

}

И есть ошибка:

typeMismatch (Swift.Array, Swift.DecodingError.Context (codingPath: [], debugDescription: «Ожидается декодировать массив, но вместо этого найден словарь.», UnderError : nil)) []

Большое спасибо за помощь! :)

Ответы [ 2 ]

0 голосов
/ 09 марта 2020
struct Object: Codable {
    let fields: [String: Field]
    let createTime, updateTime: String
}

struct Field: Codable {
    let timestampValue: Date
}

используйте его вот так

let object = try? JSONDecoder().decode(Object.self, from: jsonData)

используйте ловить для безопасности

object.fields.forEach { field in
    field.timestampValue
}
0 голосов
/ 09 марта 2020

Ваш root здесь словарь, а не массив [] в [UserData] указывает массив Вам нужно

struct Root: Codable {
  let fields: [String: Field]
  let createTime, updateTime: String
}

// MARK: - Field
struct Field: Codable {
  let timestampValue: String
}

let dataFromJson = try jsonDecoder.decode(Root.self, from: data)
...