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); } }
public static ServerInformation[] Deserialize(Stream stream) { var reader = new JsonTextReader(new StreamReader(stream)); var response = new List<ServerInformation>(1200); var currentProperty = string.Empty; reader.MatchNext(JsonToken.StartArray); while (reader.IsMatchNext(JsonToken.StartObject)) { var entry = new ServerInformation(); while (reader.Until(JsonToken.EndObject)) { switch (reader.TokenType) { case JsonToken.PropertyName: currentProperty = reader.Value.ToString(); break; case JsonToken.String: switch (currentProperty) { case "ip": entry.Ip = reader.Value.ToString(); break; case "name": entry.Name = reader.Value.ToString(); break; case "track": entry.TrackId = reader.Value.ToString(); break; } break; case JsonToken.Integer: switch (currentProperty) { case "port": entry.Port = int.Parse(reader.Value.ToString(), CultureInfo.InvariantCulture); break; case "cport": entry.PortC = int.Parse(reader.Value.ToString(), CultureInfo.InvariantCulture); break; case "tport": entry.PortT = int.Parse(reader.Value.ToString(), CultureInfo.InvariantCulture); break; case "clients": entry.Clients = int.Parse(reader.Value.ToString(), CultureInfo.InvariantCulture); break; case "maxclients": entry.Capacity = int.Parse(reader.Value.ToString(), CultureInfo.InvariantCulture); break; case "timeofday": entry.Time = int.Parse(reader.Value.ToString(), CultureInfo.InvariantCulture); break; case "session": entry.Session = int.Parse(reader.Value.ToString(), CultureInfo.InvariantCulture); break; case "timeleft": entry.TimeLeft = long.Parse(reader.Value.ToString(), CultureInfo.InvariantCulture); break; case "timestamp": entry.Timestamp = long.Parse(reader.Value.ToString(), CultureInfo.InvariantCulture); break; case "lastupdate": entry.LastUpdate = long.Parse(reader.Value.ToString(), CultureInfo.InvariantCulture); break; } break; case JsonToken.Boolean: switch (currentProperty) { case "pass": entry.Password = bool.Parse(reader.Value.ToString()); break; case "pickup": entry.PickUp = bool.Parse(reader.Value.ToString()); break; case "l": entry.L = bool.Parse(reader.Value.ToString()); break; } break; case JsonToken.StartArray: switch (currentProperty) { case "cars": entry.CarIds = reader.ReadStringArray(1); break; case "sessiontypes": entry.SessionTypes = reader.ReadIntArray(1); break; case "durations": entry.Durations = reader.ReadLongArray(1); break; case "country": entry.Country = reader.ReadStringArray(2); break; default: while (reader.Until(JsonToken.EndArray)) { } break; } break; default: throw new Exception("Unexpected token: " + reader.TokenType); } } response.Add(entry); } return response.ToArray(); }