public static SessionStats Deserialize(string data) {
try {
using (var textReader = new StringReader(data)) {
var reader = new JsonTextReader(textReader);
var r = new SessionStats();
var currentProperty = string.Empty;
reader.MatchNext(JsonToken.StartObject);
while (reader.Until(JsonToken.EndObject)) {
switch (reader.TokenType) {
case JsonToken.PropertyName:
currentProperty = reader.Value.ToString();
break;
case JsonToken.String:
switch (currentProperty) {
case nameof(CarId):
r.CarId = reader.Value.ToString();
break;
case nameof(TrackId):
r.TrackId = reader.Value.ToString();
break;
case nameof(Time):
r.Time = TimeSpan.Parse(reader.Value.ToString());
break;
case nameof(BestLap):
r.BestLap = TimeSpan.Parse(reader.Value.ToString());
break;
default:
throw new Exception($"Unknown key: {currentProperty} (String)");
}
break;
case JsonToken.Date:
switch (currentProperty) {
case nameof(StartedAt):
r.StartedAt = DateTime.Parse(reader.Value.ToString());
break;
default:
throw new Exception($"Unknown key: {currentProperty} (Date)");
}
break;
case JsonToken.Float:
case JsonToken.Integer:
var val = double.Parse(reader.Value.ToString(), CultureInfo.InvariantCulture);
switch (currentProperty) {
case nameof(MaxSpeed):
r.MaxSpeed = val;
break;
case nameof(Distance):
r.Distance = val;
break;
case nameof(FuelBurnt):
r.FuelBurnt = val;
break;
case nameof(LongestAirborne):
r.LongestAirborne = val;
break;
case nameof(TotalAirborne):
r.TotalAirborne = val;
break;
case nameof(LongestWheelie):
r.LongestWheelie = val;
break;
case nameof(TotalWheelie):
r.TotalWheelie = val;
break;
case nameof(LongestTwoWheels):
r.LongestTwoWheels = val;
break;
case nameof(TotalTwoWheels):
r.TotalTwoWheels = val;
break;
case nameof(TotalTyreWear):
r.TotalTyreWear = val;
break;
case nameof(GoneOffroad):
r.GoneOffroad = (int)val;
break;
case nameof(TotalCrashes):
r.TotalCrashes = (int)val;
break;
case nameof(BestLapId):
r.BestLapId = (int?)val;
break;
default:
throw new Exception($"Unknown key: {currentProperty} (Integer/Float)");
}
break;
case JsonToken.Boolean:
switch (currentProperty) {
case nameof(Penalties):
r.Penalties = bool.Parse(reader.Value.ToString());
break;
default:
throw new Exception($"Unknown key: {currentProperty} (Boolean)");
}
break;
default:
throw new Exception($"Unexpected token: {reader.TokenType}");
}
}
return r;
}
} catch (Exception e) {
Logging.Error(e);
return JsonConvert.DeserializeObject<SessionStats>(data);
}
}
}