从JSON字符串到类值的快速日期返回nil

问题描述 投票:0回答:1

如果我想将格式化的日期写入类值,则该值将为零。但是我之前声明的变量获得了日期。如果我想将其设置为类值,它将为nil。我不知道这是我的代码:

do {
        let data = try String(contentsOfFile: path,
                              encoding: .utf8)
        //print(data)

        let df = DateFormatter()
        df.dateFormat = "dd.MM.yyyy HH:mm:ss"

        if let jsonData = data.data(using: .utf8) {
            let jsonDecoder = JSONDecoder()
            let json = try jsonDecoder.decode(coreJSON.self, from: jsonData)

            for r in json.activities! {
                let run = Runs()

                let start = df.date(from: r.timestampStart!)!
                print(start)
                run.timestampStart = start
                run.timestampEnd = df.date(from: r.timestampEnd!)!

                var locations: [RunsLocations] = []
                for l in r.locations! {
                    let loc = RunsLocations()
                    loc.timestamp = df.date(from: l.timestamp!)
                    loc.latitude = l.latitude
                    loc.longitude = l.longitude
                    loc.altitude = l.altitude
                    locations.append(loc)
                }
                run.locations = locations

                run.workoutID = r.workoutID
                run.workouttype = r.workoutType
                run.distance = r.distance
                run.duration = r.duration
                run.avgpace = r.avgpace
                run.maxspeed = r.maxspeed
                run.avgspeed = r.avgspeed
                run.pausetime = r.pausetime
                run.calories = r.calories

                coreData.setWorkoutsLocal(_workout: run)
            }
        } catch {
        print(error)
      }
    } 

如果我从头开始打印日期,那么我在那里会得到日期。在r.timestampStart中,我有一个值(参见图片)。但由于没有错误,我没有收到错误。

所有其他数据将正确地传递到类值。

enter image description here

json swift date
1个回答
0
投票

在您的结构或类中将timestampStarttimestampEndtimestamp声明为Date

然后创建JSONDecoder

let jsonDecoder = JSONDecoder()
let dateFormatter = DateFormatter()
dateFormatter.locale = Locale(identifier: "en_US_POSIX")
dateFormatter.dateFormat = "dd.MM.yyyy HH:mm:ss"
decoder.dateDecodingStrategy = .formatted(dateFormatter)

并删除其他日期格式化程序。它将所有字符串日期即时解码为Date


注意:

  • 从文件中读取Data,并使用URL而不是字符串路径。

    let data = try Data(contentsOf: url)
    
  • 将结构/类中的所有属性声明为非可选,您将强制拆开并删除不必要的感叹号。

© www.soinside.com 2019 - 2024. All rights reserved.