diff --git a/JpnCardsPokemon.Sdk/Utils/JsonConverter/CardPriceConverter.cs b/JpnCardsPokemon.Sdk/Utils/JsonConverter/CardPriceConverter.cs new file mode 100644 index 0000000..e400981 --- /dev/null +++ b/JpnCardsPokemon.Sdk/Utils/JsonConverter/CardPriceConverter.cs @@ -0,0 +1,109 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text.Json; +using System.Text.Json.Serialization; +using JpnCardsPokemon.Sdk.Api; + +namespace JpnCardsPokemon.Sdk.Utils.JsonConverter; + +internal class CardPriceConverter : JsonConverter> +{ + public override IEnumerable? Read(ref Utf8JsonReader reader, Type typeToConvert, + JsonSerializerOptions options) + { + var resultBucket = new List(); + + // read sellers + while (reader.Read()) + { + // Finished parsing? + if (reader.TokenType == JsonTokenType.EndArray) + break; + + + if (reader.TokenType != JsonTokenType.PropertyName) continue; + var sellerName = reader.GetString(); + + // Versions + while (reader.Read()) + { + if (reader.TokenType == JsonTokenType.EndArray) + break; + + // Version, usually "Regular" + if (reader.TokenType != JsonTokenType.PropertyName) continue; + var cardVersion = reader.GetString(); + + // Conditions + while (reader.Read()) + { + if (reader.TokenType == JsonTokenType.EndObject) break; + + if (reader.TokenType != JsonTokenType.PropertyName) continue; + var condition = reader.GetString(); + + var cardPrice = new CardPrice + { + Seller = sellerName, + Version = cardVersion, + Condition = condition + }; + + var propertyName = string.Empty; + // Final price properties + while (reader.Read()) + { + if (reader.TokenType == JsonTokenType.EndObject) break; + + + if (reader.TokenType == JsonTokenType.PropertyName) + { + propertyName = reader.GetString(); + } + else + { + // search correct property in object + if (string.IsNullOrEmpty(propertyName)) continue; + + var property = cardPrice.GetType().GetProperty(propertyName) ?? cardPrice + .GetType().GetProperties().FirstOrDefault(p => + p.GetCustomAttributes(typeof(JsonPropertyNameAttribute), true) + .Cast() + .Any(a => a.Name.Equals(propertyName, + StringComparison.InvariantCultureIgnoreCase))); + if (property != null) + { + object? value = null; + var propertyType = property.PropertyType; + + if (propertyType == typeof(string)) + value = reader.GetString(); + else if (propertyType == typeof(decimal)) + value = reader.GetDecimal(); + else if (propertyType == typeof(DateTime)) + if (DateTime.TryParse(reader.GetString(), out var dt)) + value = dt; + + property.SetValue(cardPrice, value); + } + + propertyName = string.Empty; + } + } + + // add card to bucket + resultBucket.Add(cardPrice); + } + } + } + + + return resultBucket; + } + + public override void Write(Utf8JsonWriter writer, IEnumerable value, JsonSerializerOptions options) + { + throw new NotImplementedException(); + } +} \ No newline at end of file