/// <summary> /// GetTimeSeriesDataList has to do some custom manipulation with the returned representation /// </summary> /// <param name="serializer"></param> /// <param name="timeSeriesDataJson"></param> /// <returns></returns> internal static HeartActivitiesIntraday GetHeartRateIntraday(this JsonDotNetSerializer serializer, DateTime date, string heartRateIntradayJson) { if (string.IsNullOrWhiteSpace(heartRateIntradayJson)) { throw new ArgumentNullException("heartRateIntradayJson", "heartRateIntradayJson can not be empty, null or whitespace."); } JToken activitiesHeartIntraday = JToken.Parse(heartRateIntradayJson)["activities-heart-intraday"]; JToken dataset = activitiesHeartIntraday["dataset"]; HeartActivitiesIntraday result = new HeartActivitiesIntraday { ActivitiesHeart = serializer.Deserialize <IntradayActivitiesHeart>(JToken.Parse(heartRateIntradayJson)["activities-heart"].First()), Dataset = (from item in dataset select new DatasetInterval { Time = DateTime.Parse(date.ToString("yyyy-MM-dd") + " " + item["time"].ToString()), //here, maybe pass in the date so we have a full object of date and time Value = int.Parse(item["value"].ToString()) }).ToList(), DatasetInterval = Convert.ToInt32(activitiesHeartIntraday["datasetInterval"]), DatasetType = activitiesHeartIntraday["datasetType"].ToString() }; return(result); }
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) { HeartActivitiesIntraday heartActivitiesIntraday = value as HeartActivitiesIntraday; //{ writer.WriteStartObject(); writer.WritePropertyName("ActivitiesHeart"); writer.WriteValue(heartActivitiesIntraday.ActivitiesHeart); // "DatasetInterval" : "1" writer.WritePropertyName("DatasetInterval"); writer.WriteValue(heartActivitiesIntraday.DatasetInterval); // "DatasetType" : "SecondsHeartrate" writer.WritePropertyName("DatasetType"); writer.WriteValue(heartActivitiesIntraday.DatasetType); writer.WritePropertyName("Dataset"); writer.WriteStartArray(); foreach (DatasetInterval datasetInverval in heartActivitiesIntraday.Dataset) { // "Time" : "2008-09-22T14:01:54.9571247Z" writer.WritePropertyName("Time"); writer.WriteValue(datasetInverval.Time.ToString("o")); // "Value": 1 writer.WritePropertyName("Value"); writer.WriteValue(datasetInverval.Value); } writer.WriteEndArray(); //} writer.WriteEndObject(); }
public void Can_Deserialize_HeartRateIntradayTimeSeries() { //assemble string content = SampleDataHelper.GetContent("GetHeartRateIntradayTimeSeries1.1.json"); DateTime date = DateTime.Parse("2017-08-21"); //hardcoded because extension expects a date. In any other use case, a date would be available JsonDotNetSerializer seralizer = new JsonDotNetSerializer(); //act HeartActivitiesIntraday stats = seralizer.GetHeartRateIntraday(date, content); //assert ValidateHeartRateIntradayTimeSeriesData(stats); }
private void ValidateHeartRateIntradayTimeSeriesData(HeartActivitiesIntraday activity) { //Activities Heart Intraday var actIntraday = activity; actIntraday.Dataset.Count().Should().Be(96); //Dataset count actIntraday.Dataset[0].Time.TimeOfDay.Should().Be(new TimeSpan(0, 0, 0, 0)); //First entry actIntraday.Dataset[0].Value.Should().Be(57); actIntraday.Dataset[95].Time.TimeOfDay.Should().Be(new TimeSpan(0, 23, 45, 0)); //Last entry actIntraday.Dataset[95].Value.Should().Be(47); actIntraday.DatasetInterval.Should().Be(15); //Dataset interval actIntraday.DatasetType.Should().Be("minute"); //Dataset Type //Activities Heart var act = activity.ActivitiesHeart; act.DateTime.Should().Be(new DateTime(2017, 8, 21)); //DateTime act.HeartRateZones.Count().Should().Be(4); //Zones Count act.HeartRateZones[0].CaloriesOut.Should().Be(2071.96748); //First zone act.HeartRateZones[0].Max.Should().Be(92); act.HeartRateZones[0].Min.Should().Be(30); act.HeartRateZones[0].Minutes.Should().Be(1387); act.HeartRateZones[0].Name.Should().Be("Out of Range"); act.HeartRateZones[3].CaloriesOut.Should().Be(186.84666); //Last zone act.HeartRateZones[3].Max.Should().Be(220); act.HeartRateZones[3].Min.Should().Be(156); act.HeartRateZones[3].Minutes.Should().Be(14); act.HeartRateZones[3].Name.Should().Be("Peak"); act.CustomHeartRateZones.Count().Should().Be(0); //Empty CustomHeart Rate Zones act.Value.Should().Be(55.44); //Value }
public async Task GetHeartRateIntradayTimeSeriesAsync_Success() { string content = SampleDataHelper.GetContent("GetHeartRateIntradayTimeSeries1.1.json"); Func <HttpResponseMessage> responseMessage = new Func <HttpResponseMessage>(() => new HttpResponseMessage(HttpStatusCode.OK) { Content = new StringContent(content) }); Action <HttpRequestMessage, CancellationToken> verification = new Action <HttpRequestMessage, CancellationToken>((message, token) => { string uri = $"https:/" + $"/api.fitbit.com/1.1/user/-/activities/heart/date/{DateTime.Today:yyyy-MM-dd}/{DateTime.Today:yyyy-MM-dd}/15min/time/00:00:00/23:59:59.json"; Assert.AreEqual(HttpMethod.Get, message.Method); Assert.AreEqual(uri, message.RequestUri.AbsoluteUri); }); FitbitClient fitbitClient = Helper.CreateFitbitClient(responseMessage, verification); HeartActivitiesIntraday response = await fitbitClient.GetHeartRateIntraday(DateTime.Today, HeartRateResolution.fifteenMinute); ValidateHeartRateIntradayTimeSeriesData(response); }
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) { JObject jsonObject = JObject.Load(reader); var properties = jsonObject.Properties().ToList(); HeartActivitiesIntraday result = new HeartActivitiesIntraday(); result.DatasetInterval = Convert.ToInt32(jsonObject["DatasetInterval"]); result.DatasetType = jsonObject["DatasetType"].ToString(); result.Dataset = new List <DatasetInterval>(); foreach (JToken item in jsonObject["Dataset"].Children()) { result.Dataset.Add(new DatasetInterval() { Time = DateTime.Parse(item["Time"].ToString()), Value = Convert.ToInt32(item["Value"]) }); } ; return(result); }