Buổi tập - định dạng xuất JSON
Tài liệu cấu trúc buổi tập trong xuất JSON
Cập nhật lần cuối: 31 tháng 10, 2026
Trên trang này
Xuất JSON lưu buổi tập trong mảng workouts.
Phiên bản xuất
Health Auto Export hỗ trợ hai phiên bản xuất buổi tập:
- Phiên bản 2 (Khuyến nghị): Định dạng nâng cao với metadata chi tiết hơn và dữ liệu có cấu trúc
- Phiên bản 1 (Cũ): Định dạng cũ hơn giữ để tương thích với quy trình hiện có
Buổi tập Phiên bản 2
Phiên bản 2 gồm các trường bắt buộc sau và dữ liệu tùy chọn. Ví dụ dùng Địa phương hóa đơn vị tắt; bật có thể đổi nhãn đơn vị trong chuỗi chỉ số.
Cấu trúc cơ bản
{
"id": "550e8400-e29b-41d4-a716-446655440000",
"name": "Running",
"start": "2024-02-06 07:00:00 -0800",
"end": "2024-02-06 07:30:00 -0800",
"duration": 1800
}
Trường bắt buộc
id(String): Định danh duy nhất của buổi tậpname(String): Tên loại buổi tập (ví dụ "Running", "Cycling", "Swimming")start(Date): Thời gian bắt đầu buổi tập ở định dạngyyyy-MM-dd HH:mm:ss Zend(Date): Thời gian kết thúc buổi tập ở định dạngyyyy-MM-dd HH:mm:ss Zduration(Number): Thời lượng buổi tập theo giây
Trường tùy chọn
Trường tùy chọn phụ thuộc dữ liệu khả dụng và lựa chọn xuất:
Nguồn ghi
{
"source": {
"name": "Workout App",
"identifier": "com.example.workouts"
}
}
source(Object): Ứng dụng hoặc thiết bị ghi buổi tập, với tên và định danh ứng dụng. Các số đo chỉ số riêng có chuỗi nguồn riêng và có thể đến từ ứng dụng hoặc thiết bị khác.
Thông tin vị trí
{
"location": "Outdoor",
"isIndoor": false
}
location(String): Một trong"Indoor","Outdoor","Pool","Open Water"isIndoor(Boolean): Buổi tập có được thực hiện trong nhà hay không
Năng lượng và cường độ
{
"activeEnergyBurned": {
"qty": 350,
"units": "kcal"
},
"totalEnergy": {
"qty": 450,
"units": "kcal"
},
"intensity": {
"qty": 8.5,
"units": "kcal/hr\u00b7kg"
}
}
activeEnergyBurned(Object): Calo hoạt động đốt trong buổi tậptotalEnergy(Object): Tổng calo (hoạt động + nghỉ) đã đốtintensity(Object): Giá trị tương đương trao đổi chất (MET)
Khoảng cách và tốc độ
{
"distance": {
"qty": 3.5,
"units": "mi"
}
}
distance(Object): Tổng khoảng cách đã đispeed(Object): Tốc độ trung bình tính từ khoảng cách và thời lượngavgSpeed(Object): Tốc độ trung bình trong suốt buổi tậpmaxSpeed(Object): Tốc độ tối đa đạt được
Mỗi đối tượng gồm qty và units.
Độ cao
{
"elevationUp": {
"qty": 500,
"units": "ft"
},
"elevationDown": {
"qty": 450,
"units": "ft"
}
}
elevationUp(Object): Tổng độ cao tăngelevationDown(Object): Tổng độ cao giảm
Đơn vị: "ft" (feet) hoặc "m" (mét)
Dữ liệu môi trường
{
"temperature": {
"qty": 72,
"units": "degF"
},
"humidity": {
"qty": 65,
"units": "%"
}
}
temperature(Object): Nhiệt độ môi trường trong buổi tậphumidity(Object): Độ ẩm tương đối theo phần trăm
Đơn vị nhiệt độ: "degF" (Fahrenheit) hoặc "degC" (Celsius)
Trường riêng cho bơi
{
"lapLength": {
"qty": 0.025,
"units": "mi"
},
"strokeStyle": "Freestyle",
"swolfScore": 45,
"salinity": "Fresh Water",
"totalSwimmingStrokeCount": {
"qty": 1200,
"units": "count"
},
"swimCadence": {
"qty": 30,
"units": "count/min"
}
}
lapLength(Object): Chiều dài mỗi vòngstrokeStyle(String): Một trong:"Backstroke""Breaststroke""Butterfly""Freestyle""Mixed""Kickboard""Unknown"
swolfScore(Number): Điểm hiệu quả bơisalinity(String):"Fresh Water"hoặc"Salt Water"totalSwimmingStrokeCount(Object): Tổng số cú quạtswimCadence(Object): Cú quạt mỗi phút
Dữ liệu bước và nhịp
{
"stepCount": [
{
"date": "2024-02-06 07:00:00 -0800",
"qty": 5000,
"units": "count",
"source": "Apple Watch"
}
],
"stepCadence": {
"qty": 180,
"units": "count/min"
},
"flightsClimbed": {
"qty": 10,
"units": "count"
}
}
stepCount(Array): Mảng đo số bước theo thời gianstepCadence(Object): Bước mỗi phútflightsClimbed(Object): Số tầng cầu thang đã leo
Dữ liệu nhịp tim
{
"heartRate": {
"min": {
"qty": 120,
"units": "count/min"
},
"avg": {
"qty": 150,
"units": "count/min"
},
"max": {
"qty": 175,
"units": "count/min"
}
},
"maxHeartRate": {
"qty": 175,
"units": "count/min"
},
"avgHeartRate": {
"qty": 150,
"units": "count/min"
},
"heartRateData": [
{
"date": "2024-02-06 07:00:00 -0800",
"Min": 120,
"Avg": 150,
"Max": 175,
"units": "count/min",
"source": "Apple Watch"
}
],
"heartRateRecovery": [
{
"date": "2024-02-06 07:30:00 -0800",
"Min": 140,
"Avg": 145,
"Max": 150,
"units": "count/min",
"source": "Apple Watch"
}
]
}
heartRate(Object): Tóm tắt với nhịp tim min, avg và max trong buổi tậpmaxHeartRate(Object): Nhịp tim tối đa trong buổi tậpavgHeartRate(Object): Nhịp tim trung bình trong buổi tậpheartRateData(Array): Đo chi tiết từ buổi tập, kết thúc khi buổi tập kết thúcheartRateRecovery(Array): Đo riêng từ hai phút ngay sau khi buổi tập kết thúc
Nhịp tim tóm tắt dùng giá trị buổi tập đã ghi khi có, quay về số đo nhịp của buổi tập. Các số đo đã xuất gồm đo trong lúc tạm dừng, nên đỉnh và trung bình có thể khác tóm tắt.
Mảng dữ liệu chuỗi thời gian
Nhiều chỉ số có thể được gồm dưới dạng mảng chuỗi thời gian khi bật «Bao gồm chỉ số buổi tập»:
{
"activeEnergy": [
{
"date": "2024-02-06 07:00:00 -0800",
"qty": 50,
"units": "kcal",
"source": "Apple Watch"
}
],
"basalEnergy": [
{
"date": "2024-02-06 07:00:00 -0800",
"qty": 20,
"units": "kcal",
"source": "Apple Watch"
}
],
"cyclingCadence": [
{
"date": "2024-02-06 07:00:00 -0800",
"qty": 90,
"units": "count/min",
"source": "Apple Watch"
}
],
"cyclingDistance": [
{
"date": "2024-02-06 07:00:00 -0800",
"qty": 0.5,
"units": "mi",
"source": "Apple Watch"
}
],
"cyclingPower": [
{
"date": "2024-02-06 07:00:00 -0800",
"qty": 200,
"units": "W",
"source": "Power Meter"
}
],
"cyclingSpeed": [
{
"date": "2024-02-06 07:00:00 -0800",
"qty": 18,
"units": "mi/hr",
"source": "Apple Watch"
}
],
"swimDistance": [
{
"date": "2024-02-06 07:00:00 -0800",
"qty": 25,
"units": "yd",
"source": "Apple Watch"
}
],
"swimStroke": [
{
"date": "2024-02-06 07:00:00 -0800",
"qty": 20,
"units": "count",
"source": "Apple Watch"
}
],
"walkingAndRunningDistance": [
{
"date": "2024-02-06 07:00:00 -0800",
"qty": 0.25,
"units": "mi",
"source": "Apple Watch"
}
]
}
Cấu trúc QuantityData:
date(Date): Dấu thời gian của phép đoqty(Number): Giá trị số lượngunits(String): Đơn vị đosource(String, tùy chọn): Thiết bị hoặc ứng dụng nguồn dữ liệu
Cấu trúc HeartRateData:
date(Date): Dấu thời gian của phép đoMin(Number): Nhịp tim thấp nhấtAvg(Number): Nhịp tim trung bìnhMax(Number): Nhịp tim cao nhấtunits(String): Đơn vị (count/minkhi Địa phương hóa đơn vị tắt)source(String, tùy chọn): Thiết bị hoặc ứng dụng nguồn dữ liệu
Dữ liệu tuyến đường
Khi bật «Bao gồm dữ liệu tuyến đường» và buổi tập có dữ liệu GPS:
{
"route": [
{
"latitude": 37.7749,
"longitude": -122.4194,
"altitude": 50.5,
"course": 45.0,
"courseAccuracy": 5.0,
"horizontalAccuracy": 10.0,
"verticalAccuracy": 15.0,
"timestamp": "2024-02-06 07:00:00 -0800",
"speed": 7.0,
"speedAccuracy": 0.5
}
]
}
Trường vị trí:
latitude(Number): Tọa độ vĩ độ GPSlongitude(Number): Tọa độ kinh độ GPSaltitude(Number): Độ cao theo métcourse(Number): Hướng di chuyển theo độ (0-360)courseAccuracy(Number): Độ chính xác đo hướng theo độhorizontalAccuracy(Number): Độ chính xác vị trí ngang theo métverticalAccuracy(Number): Độ chính xác vị trí đứng theo méttimestamp(Date): Thời gian ghi vị tríspeed(Number): Tốc độ theo mét mỗi giâyspeedAccuracy(Number): Độ chính xác đo tốc độ theo m/s
Metadata
{
"metadata": {
"customField": {
"label": "value",
"quantity": 123
},
"anotherField": [
1,
2,
3
]
}
}
metadata(Object): Metadata tùy chỉnh bổ sung liên kết với buổi tập
Sự kiện, hoạt động và split
Xuất JSON và Markdown Phiên bản 2 có thể gồm events, segments, laps, và activities do ứng dụng buổi tập ghi. Chúng vẫn khả dụng khi Bao gồm chỉ số buổi tập tắt. CSV và GPX không gồm các bản ghi này.
Với Bao gồm chỉ số buổi tập bật và các chỉ số liên quan đã chọn, khoảng cũng có thể gồm khoảng cách, năng lượng hoạt động, tóm tắt nhịp tim, và nhịp/tốc độ thời gian hoạt động. Giá trị phân biệt đo đã ghi với ước tính; giá trị không khả dụng bị bỏ.
Với khoảng cách đã chọn, splits có thể gồm ước tính split kilomet và dặm. Chúng có thể khác split của ứng dụng ghi, và split cuối được đánh dấu một phần khi ngắn hơn khoảng cách mục tiêu. Số đo khoảng cách thiếu hoặc loại buổi tập không hỗ trợ có thể ngăn tính split.
Điểm nỗ lực buổi tập
Xuất JSON và Markdown Phiên bản 2 có thể gồm giá trị Điểm nỗ lực bài tập (effortScore) và Điểm nỗ lực bài tập ước tính (estimatedEffortScore) đã chọn. Mỗi cái là đối tượng với qty và units: "appleEffortScore".
Điểm cần iOS 18 trở lên và quyền truy cập dữ liệu tương ứng trong Apple Health. Điểm toàn buổi và điểm hoạt động tách biệt. Chúng độc lập với Nhóm thời gian và Bao gồm chỉ số buổi tập; CSV không gồm chúng.
Trong Duyệt → Buổi tập, mở sheet xuất của danh sách hoặc cài đặt xuất Phiên bản 2 của một buổi tập, rồi dùng Chọn trường xuất để chọn điểm nỗ lực trước khi xuất.
Nhóm thời gian chỉ số buổi tập
Khi dùng Phiên bản xuất 2 và bật «Bao gồm chỉ số buổi tập», bạn có thể kiểm soát độ chi tiết dữ liệu chuỗi thời gian:
- Phút: Nhóm chỉ số buổi tập theo phút đồng hồ. Phút đầu và cuối có thể gồm vài giây ngay trước khi buổi tập bắt đầu hoặc ngay sau khi kết thúc.
- Giây: Nhóm chỉ số buổi tập theo giây đồng hồ, mỗi dấu thời gian đánh dấu bắt đầu giây đó. Giây đầu và cuối có thể gồm phần giây ngay ngoài buổi tập. Tệp lớn hơn nhóm phút.
Năng lượng hoạt động và nghỉ dùng cùng tổng kết hợp như các chỉ số buổi tập khác trong mỗi nhóm thời gian. Số đo từ nhiều thiết bị hoặc ứng dụng được gồm cùng nhau.
Buổi tập Phiên bản 1 (Cũ)
Phiên bản 1 dùng cấu trúc đơn giản hơn. Đối với xuất mới, khuyến nghị Phiên bản 2.
Cấu trúc Phiên bản 1
{
"name": "Running",
"start": "2024-02-06 07:00:00 -0800",
"end": "2024-02-06 07:30:00 -0800",
"totalEnergy": {
"qty": 450,
"units": "kcal"
},
"activeEnergy": {
"qty": 350,
"units": "kcal"
},
"distance": {
"qty": 3.5,
"units": "mi"
},
"heartRateData": [
{
"date": "2024-02-06 07:00:00 -0800",
"qty": 150,
"units": "bpm"
}
],
"route": [
{
"lat": 37.7749,
"lon": -122.4194,
"altitude": 50.5,
"timestamp": "2024-02-06 07:00:00 -0800"
}
]
}