Decimal没有转换指数值(jsonConverter从JSON到C#)-映射
通过使用JSON转换器将JSON转换为c#,我面临一个问题。其中我有一个字段decimal,JSON有一个指数值,它不转换,因为decimal将其作为字符串而不是双精度: 错误:无法将字符串转换为十进制:1.096E8Decimal没有转换指数值(jsonConverter从JSON到C#)-映射,c#,json,asp.net-mvc,json.net,C#,Json,Asp.net Mvc,Json.net,通过使用JSON转换器将JSON转换为c#,我面临一个问题。其中我有一个字段decimal,JSON有一个指数值,它不转换,因为decimal将其作为字符串而不是双精度: 错误:无法将字符串转换为十进制:1.096E8 C# public decimal Amount { get; set; } JSON "Amount":"1.096E8" 如果您想通过JsonConverter转换指数,那么 public class MyClassName { [JsonConverter
C#
public decimal Amount { get; set; }
JSON
"Amount":"1.096E8"
如果您想通过
JsonConverter
转换指数,那么
public class MyClassName
{
[JsonConverter(typeof(JsonExponentialConverter))]
public decimal Amount { get; set; }
}
这是一个json转换器,用于将指数数转换为十进制数
public class JsonExponentialConverter : JsonConverter
{
public override bool CanRead { get { return true; } }
public override bool CanConvert(Type objectType)
{
return true;
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
serializer.Serialize(writer, value);
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
decimal amount = 0;
if (decimal.TryParse(reader.Value.ToString(), NumberStyles.Any, CultureInfo.InvariantCulture, out amount))
{
return amount;
}
return amount;
}
}
并使用类似json的反序列化程序调用上述类
public class Program
{
static void Main(string[] args)
{
var json = @"{'Amount':'1.096E8'}";
var amount = JsonConvert.DeserializeObject<MyClassName>(json);
}
}
公共类程序
{
静态void Main(字符串[]参数)
{
var json=@“{'Amount':'1.096E8'}”;
var amount=JsonConvert.DeserializeObject(json);
}
}
输出:
所以我使用了[JsonConstructor],我将它附加到了类的自定义构造函数中 这是代码
class myClass
{
public decimal Amount { get; set; }
[JsonConstructor]
public myClass(string amount)
{
this.Amount = Decimal.Parse(amount, System.Globalization.NumberStyles.Float);
}
}
你是如何试图转化的?你试过什么?试试这个
double.Parse(“1.096E-8”,CultureInfo.InvariantCulture)
这个值不能转换成decimal
-但是如果你让属性double
使用double
数据类型,比如public double Amount{get;set;},它会起作用
然后将其指定为var exp=double.Parse(amount,NumberStyles.AllowExponent | NumberStyles.Float,CultureInfo.InvariantCulture)代码>。要再次显示指数表示法,请使用string.Format(“{0:e}”,exp)代码>@StephenMuecke double是自动舍入值,因此我无法使用double@WarisSarwar,查看答案可能对你有帮助:)查看,看起来不错,但我已经做了,顺便说一句,非常感谢:)看看我的答案,在这里你必须在构造函数中传递amount
,每次你必须将它转换为十进制。在我的答案中,你不需要任何构造函数来定义它和它的可重用代码,你可以在任何地方使用它,只要定义你的任何十进制属性类似于[JsonConverter(typeof(JsonExponentialConverter))]
而不需要在每个构造函数中编写代码。始终尝试使用可重用代码。同意,但要使用此属性[JsonConverter(typeof(JsonExponentialConverter))]我必须创建类JsonExponentialConverteryes这很好创建一次,您的模型变得干净,而不是您必须在您的模型中编写代码,并在构造函数中每次传递数量,当您在项目中的任何地方调用此模型时,请告诉我哪一个是好的?我认为创建类没什么大不了的,它的可重用性也很重要,如果你的数量不是指数级的,那么你的代码将如何处理这意味着如果它包含像1.096E8XX
,它会抛出一个异常,你必须处理它,假设您的json不包含此类错误,但最后您还需要处理这些场景。