十进制未转换指数值(JSONConverter从JSON到C#)-映射

时间:2018-09-05 05:59:03

标签: c# json asp.net-mvc json.net

通过使用JSON转换器将JSON转换为c#,我遇到了一个问题。我有一个十进制字段,而JSON具有一个指数值,该值未转换,因为十进制将其作为字符串而不是双精度值:

错误:无法将字符串转换为十进制:1.096E8

C#    
public decimal Amount { get; set; }
JSON
"Amount":"1.096E8"

2 个答案:

答案 0 :(得分:1)

如果您想用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);
    }
}

输出:

enter image description here

答案 1 :(得分:0)

所以我使用了[JsonConstructor],我将其附加到我的类的自定义构造函数上。

这是代码。

 class myClass
 {
    public decimal Amount { get; set; }

    [JsonConstructor]
    public myClass(string amount)
    {
        this.Amount = Decimal.Parse(amount, System.Globalization.NumberStyles.Float);
    }
}