如何解决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 举报,一经查实,本站将立刻删除。