I tried to complement your code with missing parts.
To make it work, you need to declare all "value" including sys and did as optional.
Here is some code to show this running (in playground):
let heartJSON =
"""
["BloodPressure:" {
"endDate" : "2020-01-25",
"systolicValue" : "122",
"diastolicValue" : "62"
"startDate" : "2020-01-25"
},
"HeartRate:" {
"endDate" : "2020-01-25",
"Value" : "78",
"startDate" : "2020-01-25"
},
"BMI:" {
"endDate" : "2020-01-25",
"Value" : "23",
"startDate" : "2020-01-25"
}
]
}
"""
enum HealthDataType: String, Codable {
case bloodPressure = "BloodPressure"
case heartRate = "HeartRate"
case bmi = "BMI"
}
struct HealtDataItem: Codable {
let endDate: Date
let value: Double?
let systolicValue : Double?
let diastolicValue : Double?
let startDate: Date
let type: HealthDataType
}
let end = Date()
let bmiValue = 12.0
let start = Date()
let bloodPressureItem = HealtDataItem(endDate: end, value: nil, systolicValue : 8.0, diastolicValue: 12.0, startDate: start, type: .bloodPressure)
let bmiItem = HealtDataItem(endDate: end, value: bmiValue, systolicValue : nil, diastolicValue: nil, startDate: start, type: .bmi)
let healthData = [bloodPressureItem, bmiItem]
do {
let data = try JSONEncoder().encode(healthData)
let jsonDecoder = JSONDecoder()
do {
let decodedData = try jsonDecoder.decode([HealtDataItem].self, from: data)
for extracted in decodedData {
print(extracted.type, extracted.startDate, extracted.value ?? "-", extracted.systolicValue ?? "-", extracted.diastolicValue ?? "-")
}
} catch {
print(Decoding error")
}
} catch {
//error handling
}
Which gives (take care, values are totally phony):
bloodPressure 2021-04-16 13:36:43 +0000 - 8.0 12.0
bmi 2021-04-16 13:36:43 +0000 12.0 - -
You could avoid the need to declare all the missing values with:
struct HealtDataItem: Codable {
let endDate: Date
var value: Double? = nil
var systolicValue : Double? = nil
var diastolicValue : Double? = nil
let startDate: Date
let type: HealthDataType
}
let end = Date()
let bmiValue = 12.0
let start = Date()
let bloodPressureItem = HealtDataItem(endDate: end, systolicValue : 8.0, diastolicValue: 12.0, startDate: start, type: .bloodPressure)
let bmiItem = HealtDataItem(endDate: end, value: bmiValue, startDate: start, type: .bmi)
let healthData = [bloodPressureItem, bmiItem]
do {
let data = try JSONEncoder().encode(healthData)
let jsonDecoder = JSONDecoder()
do {
let decodedData = try jsonDecoder.decode([HealtDataItem].self, from: data)
for extracted in decodedData {
print(extracted.type, extracted.startDate, extracted.value ?? "-", extracted.systolicValue ?? "-", extracted.diastolicValue ?? "-")
}
} catch {
}
} catch {
//error handling
}
Which gives:
bloodPressure 2021-04-16 13:50:45 +0000 - 8.0 12.0
bmi 2021-04-16 13:50:45 +0000 12.0 - -
Topic:
App & System Services
SubTopic:
General
Tags: