无法使用Json.Net反序列化指数数字

时间:2015-01-27 03:25:05

标签: c# json parsing json.net

我正在从证券交易所市场解析一些价值并且我的解析器工作正常,除了某些情况,我连接的API的数值返回如下:

{
   "stock_name": "SOGDR50",
   "price": "6.1e-7"
}

在大多数请求中,price以十进制形式出现(例如:0.00757238)并且一切正常,但当price是指数表示时,我的解析器会中断。

我正在使用Json.Nethttp://www.newtonsoft.com/json

我的代码是:

T response = JsonConvert.DeserializeObject<T>(jsonResult);

我和JsonSerializerSettings一起玩,但没有提出任何解决方案。我可以手工解析有问题的数字,但我需要响应自动反序列化到适当的对象,具体取决于调用的API方法。

关于如何解决这个问题的任何想法?

编辑1:

public class StockResponse
{
    [JsonConstructor]
    public StockResponse(string stock_name, string price)
    {
        Stock_Name = stock_name;
        Price = Decimal.Parse(price.ToString(), NumberStyles.Float);
    }

    public String ShortName { get; set; }
    public String LongName { get; set; }
    public String Stock_Name{ get; set; }
    public Decimal Price { get; set; }
    public Decimal Spread { get; set; }
}

1 个答案:

答案 0 :(得分:4)

JSON.NET包含您可以附加到自定义构造函数的[JsonConstructor]属性。有了它,你可以这样做:

[JsonConstructor]
//The names of the parameters need to match those in jsonResult
public StockQuote(string stock_name, string price)
{
    this.stock_name = stock_name;
    //You need to explicitly tell the system it is a floating-point number
    this.price = Decimal.Parse(price, System.Globalization.NumberStyles.Float);
}

编辑:

除上述内容外,请使用[JsonObject]属性标记您的课程。这是序列化和反序列化所必需的。我能够使用以下命令成功序列化和反序列化:

class Program
{
    static void Main(string[] args)
    {
        var quote = new StockQuote("test", "6.1e-7");
        string data = JsonConvert.SerializeObject(quote);
        Console.WriteLine(data);

        StockQuote quoteTwo = JsonConvert.DeserializeObject<StockQuote>(data);
        Console.ReadLine();
    }
}

[JsonObject]
public class StockQuote
{
    //If you want to serialize the class into a Json, you will need the
    //JsonProperty attributes set
    [JsonProperty(PropertyName="name")]
    public string Name { get; set; }
    [JsonProperty(PropertyName="price")]
    public decimal Price { get; set; }

    [JsonConstructor]
    public StockQuote(string name, string price)
    {
        this.Name = name;
        this.Price = Decimal.Parse(price, System.Globalization.NumberStyles.Float);
    }
}