Вам на самом деле не нужны эти поля поддержки. Вы можете просто написать их как автоматические свойства с { get; set; }
.
Ваш JSON содержит некоторые довольно раздражающие вещи, а именно даты и числа в виде строк. Поэтому я рекомендую вам использовать что-то вроде QuickType , чтобы сгенерировать для вас класс модели C #.
Вот результат:
using Newtonsoft.Json;
using Newtonsoft.Json.Converters;
public partial class SleepEntry
{
[JsonProperty("Entry_number")]
[JsonConverter(typeof(ParseStringConverter))]
public long EntryNumber { get; set; }
[JsonProperty("Entry_date")]
public DateTimeOffset EntryDate { get; set; }
[JsonProperty("Customer_number")]
[JsonConverter(typeof(ParseStringConverter))]
public long CustomerNumber { get; set; }
[JsonProperty("Entry_value")]
[JsonConverter(typeof(ParseStringConverter))]
public long EntryValue { get; set; }
[JsonProperty("Comment")]
public string Comment { get; set; }
}
public partial class SleepEntry
{
public static SleepEntry[] FromJson(string json) => JsonConvert.DeserializeObject<SleepEntry[]>(json, QuickType.Converter.Settings);
}
public static class Serialize
{
public static string ToJson(this SleepEntry[] self) => JsonConvert.SerializeObject(self, QuickType.Converter.Settings);
}
internal static class Converter
{
public static readonly JsonSerializerSettings Settings = new JsonSerializerSettings
{
MetadataPropertyHandling = MetadataPropertyHandling.Ignore,
DateParseHandling = DateParseHandling.None,
Converters =
{
new IsoDateTimeConverter { DateTimeStyles = DateTimeStyles.AssumeUniversal }
},
};
}
internal class ParseStringConverter : JsonConverter
{
public override bool CanConvert(Type t) => t == typeof(long) || t == typeof(long?);
public override object ReadJson(JsonReader reader, Type t, object existingValue, JsonSerializer serializer)
{
if (reader.TokenType == JsonToken.Null) return null;
var value = serializer.Deserialize<string>(reader);
long l;
if (Int64.TryParse(value, out l))
{
return l;
}
throw new Exception("Cannot unmarshal type long");
}
public override void WriteJson(JsonWriter writer, object untypedValue, JsonSerializer serializer)
{
if (untypedValue == null)
{
serializer.Serialize(writer, null);
return;
}
var value = (long)untypedValue;
serializer.Serialize(writer, value.ToString());
return;
}
public static readonly ParseStringConverter Singleton = new ParseStringConverter();
}
Использование:
// sleepEntries is a SleepEntry[]
var sleepEntries = SleepEntry.FromJson(jsonString);
Теперь я хочу попробовать и проверить для каждой записи, если дата была на этой неделе. Затем просто получите Entry_value каждой записи на этой неделе и покажите ее в текстовом поле.
Чтобы выяснить, относятся ли два времени даты к одной и той же неделе, мы можем использовать этот метод:
private bool DatesAreInTheSameWeek(DateTime date1, DateTime date2)
{
var cal = System.Globalization.DateTimeFormatInfo.CurrentInfo.Calendar;
var d1 = date1.Date.AddDays(-1 * (int)cal.GetDayOfWeek(date1));
var d2 = date2.Date.AddDays(-1 * (int)cal.GetDayOfWeek(date2));
return d1 == d2;
}
скопировано с этого вопроса .
Тогда это можно сделать с помощью небольшого количества LINQ:
List<long> list = sleepEntries.Where(x => DatesAreInTheSameWeek(x.EntryDate.DateTime, DateTime.Now)).Select(x => x.EntryValue).ToList();