Десериализовать свойство json. net в верхнем регистре - PullRequest
0 голосов
/ 12 июля 2020

Учитывая следующий POCO:

public class AggV2
{
    [JsonProperty("T")]
    public string Ticker { get; set; }
    [JsonProperty("v")]
    public decimal Volume { get; set; }
    [JsonProperty("o")]
    public decimal Open { get; set; }
    [JsonProperty("c")]
    public decimal Close { get; set; }
    [JsonProperty("h")]
    public decimal High { get; set; }
    [JsonProperty("l")]
    public decimal Low { get; set; }
    [JsonProperty("t")]
    [JsonConverter(typeof(UnixMillisecondsConverter))]
    public DateTimeOffset Timestamp { get; set; }
}

Я видел, что сторонний поставщик данных отправляет смешанный регистр для одного и того же тикера, то есть MsFT и MSFT - это вызывает кошмары с ключевыми ограничениями MS SQL !

Первый шаг - отфильтровать до общего случая, чтобы значение свойства Ticker всегда было MSFT для приведенного выше примера.

Как я могу гарантировать, что Ticker всегда сериализуется в верхнем регистре, пожалуйста?

1 Ответ

0 голосов
/ 12 июля 2020

Я написал следующий конвертер, будет ли это лучший способ практики или я заново изобрел колесо?

public class AggV2
{
    [JsonProperty("T")]
    [JsonConverter(typeof(UppercaseStringConverter))]
    public string Ticker { get; set; }
    [JsonProperty("v")]
    public decimal Volume { get; set; }
    [JsonProperty("o")]
    public decimal Open { get; set; }
    [JsonProperty("c")]
    public decimal Close { get; set; }
    [JsonProperty("h")]
    public decimal High { get; set; }
    [JsonProperty("l")]
    public decimal Low { get; set; }
    [JsonProperty("t")]
    [JsonConverter(typeof(UnixMillisecondsConverter))]
    public DateTimeOffset Timestamp { get; set; }
    [JsonProperty("n")]
    public int Samples { get; set; }
}

public class UppercaseStringConverter : JsonConverter
{
    public override bool CanConvert(Type objectType)
    {
        return objectType == typeof(string);
    }

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        if (value is string str)
            writer.WriteValue(str.ToUpper());
        else
            throw new JsonSerializationException("Expected date object value.");
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        bool nullable = Nullable.GetUnderlyingType(objectType) != null;

        if (reader.TokenType == JsonToken.Null)
        {
            if (!nullable)
            {
                throw new JsonSerializationException($"Cannot convert null value to {objectType}.");
            }
            return null;
        }

        if (reader.TokenType == JsonToken.String)
            return ((string)reader.Value).ToUpper();
        else
            throw new JsonSerializationException($"Unexpected token parsing date. Expected String, got {reader.TokenType}.");
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...