ASP.NET Core 5 既不尊重 JsonConverter 也不尊重 TypeConverter appsettings.json片段另外,JsonConverter 示例

问题描述

标题不言自明的。 ASP.NET Core 5 既不尊重 JsonConverter 也不尊重 TypeConverter。

符号,例如"TRX/USDT" 应该被 / 分割并转换为 new Symbol("TRX","USDT"),因为我已经这样做了。基本上,我希望 services.Configure<BacktestOptions>(hostingContext.Configuration.GetSection(BacktestOptions.Backtest)) 自动解决它。

public IReadOnlyCollection<string> Symbols { get; set; } 工作正常,但 public IReadOnlyCollection<Symbol> Symbols { get; set; } 不行,因为它无法识别转换器类。

回答这个问题的人 Asp.Net Core 3.1 Appsettings not respecting JsonConverter 指出 TypeConverter 应该可以工作。

appsettings.json

{
  "Backtest": {
    "StartBalance": 1000,"StakeCurrency": "USDT","Symbols": [ "TRX/USDT","BTC/USDT","ETH/USDT" ]
  }
}

片段

public class Symbol
{
    public Symbol()
    {
    }

    public Symbol(string baseAsset,string quoteAsset)
    {
        BaseAsset = baseAsset;
        QuoteAsset = quoteAsset;
    }

    public string BaseAsset { get; set; }
    public string QuoteAsset { get; set; }
}

public class BacktestOptions
{
    public const string Backtest = "Backtest";
    
    [required]
    [Range(100,50000)]
    public decimal StartBalance { get; set; }
    
    [required]
    [RegularExpression(@"^[a-zA-Z]+$")]
    public string StakeCurrency { get; set; }
    
    [required]
    [TypeConverter(typeof(SymbolConverter))]
    public IReadOnlyCollection<Symbol> Symbols { get; set; }
}

public class SymbolConverter : TypeConverter
{
    public override bool CanConvertFrom(ITypeDescriptorContext context,Type sourceType)
    {
        if (sourceType == typeof(string))
        {
            return true;
        }

        return base.CanConvertFrom(context,sourceType);
    }
    public override object ConvertFrom(ITypeDescriptorContext context,CultureInfo culture,object value)
    {
        if (value is string v)
        {
            var parts = v.Split('/');

            return new Symbol(parts[0],parts[1]);
        }

        return base.ConvertFrom(context,culture,value);
    }
}

另外,JsonConverter 示例

public class SymbolConverter : JsonConverter<IReadOnlyCollection<Symbol>>
{
    public override IReadOnlyCollection<Symbol> Read(ref Utf8JsonReader reader,Type typetoConvert,JsonSerializerOptions options)
    {
        if (reader.TokenType == JsonTokenType.StartArray)
        {
            var values = JsonSerializer.Deserialize<string[]>(ref reader,options);

            var symbols = values.Select(value => value.Split('/')).Select(parts => new Symbol(parts[0],parts[1])).ToList();

            return new ReadOnlyCollection<Symbol>(symbols);
        }

        return null;
    }

    public override void Write(Utf8JsonWriter writer,IReadOnlyCollection<Symbol> value,JsonSerializerOptions options)
        => throw new NotImplementedException();
}

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)