如何从Google Fit REST API响应中提取并区分收缩压与舒张压?
解析Google Fit血压聚合响应:区分收缩压与舒张压
首先要明确:你当前拿到的是聚合后的血压汇总数据(数据源ID是derived:com.google.blood_pressure.summary:...),这类响应返回的是指定时间范围内血压的统计值(平均、最大、最小),而非原始的单个血压条目。
汇总数据的Value字段对应关系
com.google.blood_pressure.summary类型的value数组索引是固定的,对应含义如下:
- 索引0:收缩压平均值
- 索引1:收缩压最大值
- 索引2:收缩压最小值
- 索引3:舒张压平均值
- 索引4:舒张压最大值
- 索引5:舒张压最小值
- 索引6:心率平均值(可选,无数据则为空)
- 索引7:心率最大值(可选,无数据则为空)
结合你的响应和Google Fit里的两个条目(120/80、121/89):
- 收缩压的最大值是121(索引1的
fpVal)、最小值是120(索引2的fpVal) - 舒张压的最大值是89(索引4的
fpVal)、最小值是80(索引5的fpVal)
这正好对应你在App里看到的两个原始读数的极值。
代码示例(JavaScript)
// 假设apiResponse是你收到的完整响应对象 const parseBloodPressureSummary = (apiResponse) => { const buckets = apiResponse.bucket || []; const result = []; buckets.forEach(bucket => { bucket.dataset.forEach(dataset => { dataset.point.forEach(point => { if (point.dataTypeName === 'com.google.blood_pressure.summary') { const values = point.value; const bloodPressureStats = { startTime: new Date(parseInt(point.startTimeNanos) / 1000000), endTime: new Date(parseInt(point.endTimeNanos) / 1000000), systolic: { average: values[0]?.fpVal, max: values[1]?.fpVal, min: values[2]?.fpVal }, diastolic: { average: values[3]?.fpVal, max: values[4]?.fpVal, min: values[5]?.fpVal } }; result.push(bloodPressureStats); } }); }); }); return result; }; // 使用示例 const stats = parseBloodPressureSummary(apiResponse); console.log('收缩压极值:', `${stats[0].systolic.min}/${stats[0].diastolic.min}`, `${stats[0].systolic.max}/${stats[0].diastolic.max}`);
代码示例(Python)
from datetime import datetime def parse_blood_pressure_summary(api_response): result = [] buckets = api_response.get('bucket', []) for bucket in buckets: for dataset in bucket.get('dataset', []): for point in dataset.get('point', []): if point.get('dataTypeName') == 'com.google.blood_pressure.summary': values = point.get('value', []) blood_pressure_stats = { 'start_time': datetime.fromtimestamp(int(point['startTimeNanos']) / 1e9), 'end_time': datetime.fromtimestamp(int(point['endTimeNanos']) / 1e9), 'systolic': { 'average': values[0].get('fpVal') if len(values) > 0 else None, 'max': values[1].get('fpVal') if len(values) > 1 else None, 'min': values[2].get('fpVal') if len(values) > 2 else None }, 'diastolic': { 'average': values[3].get('fpVal') if len(values) > 3 else None, 'max': values[4].get('fpVal') if len(values) > 4 else None, 'min': values[5].get('fpVal') if len(values) > 5 else None } } result.append(blood_pressure_stats) return result # 使用示例 stats = parse_blood_pressure_summary(api_response) print(f"收缩压极值: {stats[0]['systolic']['min']}/{stats[0]['diastolic']['min']}, {stats[0]['systolic']['max']}/{stats[0]['diastolic']['max']}")
获取原始单个血压条目
如果你需要直接拿到每个单独的血压读数(比如120/80、121/89这样的成对数据),建议调用dataset:aggregate时指定原始数据源:
- 请求体中设置
dataSourceId为raw:com.google.blood_pressure(或对应的用户输入数据源raw:com.google.blood_pressure:com.google.android.apps.fitness:user_input) - 这类响应的每个
point对应一个原始读数,value数组的索引0是收缩压,索引1是舒张压。
内容的提问来源于stack exchange,提问作者abhinav mishra
相关产品推荐
相关产品推荐

