how do I convert my data to JSON format - health app

I am very new to swift.
I need to create the below JSON format

Code Block { "items" : [
“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"
}
]
}


Currently I am using enum to convert my data to JSON format. The issue with this is that my blood pressure has different keys (systolic and diastolic). Also I need to display the key names like "Items", "BloodPressure", "HearRate". 
How can I achieve my desired JSON format???

Code Block enum HealthDataType: String, Codable {
case bloodPressure
case heartRate
case bmi
}
struct HealtDataItem: Codable {
let endDate: Date
let value: Double
let startDate: Date
let type: HealthDataType
}
let bloodPressureItem = HealtDataItem(endDate: end, value: bloodPressureValue, 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)
} catch {
//error handling
}



Seems your JSON and code lack first view lines. Can you fill them and show the complete version of your JSON and code?
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):

Code Block
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:
Code Block
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 - -


how do I convert my data to JSON format - health app
 
 
Q