反序列化字符串包含带逗号的int

时间:2018-03-26 15:46:58

标签: c# .net json.net

我不能用json中的逗号反序列化数字到int。它抛出了这个例外:

Newtonsoft.Json.JsonReaderException:'无法将字符串转换为整数:24,992。路径'请求',第1行

这是我的代码:

public class PriceModel
{
    public DateTime Date { get; set; }
    public int Requests { get; set; }
    public decimal Price { get; set; }
}
string json = "{\"Date\":\"2018-03-23\",\"Requests\":\"24,992\",\"Price\":\"95.96\"}";

PriceModel value = JsonConvert.DeserializeObject<PriceModel>(json, new JsonSerializerSettings
{
    Culture = new CultureInfo("en-US")
});

我希望“请求”属性的值为24992.

是否有解决此问题的解决方案?

由于

3 个答案:

答案 0 :(得分:4)

好的经过一些研究后提出了以下解决方案,您不需要更改任何类型或任何类型,它可以根据您的要求工作。

虽然反序列化不使用返回类型var而是使用PriceModel,然后其他内容将保持不变。

创建一个继承自ProcessChildModel并覆盖ProcessModel属性的新类Requests

    public class PriceModel
    {
        public DateTime Date { get; set; }
        public int Requests { get; set; }
        public decimal Price { get; set; }
    }

    public class PriceModelChild : PriceModel
    {
        public new string Requests
        {
            set
            {
                int num;
                if (int.TryParse(value, NumberStyles.AllowThousands,
                    CultureInfo.InvariantCulture, out num))
                {
                    base.Requests = num;
                }

            }
        }
    }

然后使用新的子模型反序列化数据

string json = "{\"Date\":\"2018-03-23\",\"Requests\":\"24,992\",\"Price\":\"95.96\"}";
PriceModel value = JsonConvert.DeserializeObject<PriceModelChild>(json);

答案 1 :(得分:1)

重新定义你的班级:

public class PriceModel
{
    public DateTime Date { get; set; }
    public string Requests { get; set; }
    public decimal Price { get; set; }
}

因为数据类型int无法处理逗号。对象反序列化后,您可以删除逗号:

int requests;
int.TryParse(value.Requests.Replace(",",""), out requests);

答案 2 :(得分:0)

我今天遇到了这个问题,并提出了另一种解决方案。

首先,定义一个接受格式的JsonConverter<int>

public sealed class ThousandsIntConverter : JsonConverter<int>
{
    public override int ReadJson(
        JsonReader reader,
        Type objectType,
        int existingValue,
        bool hasExistingValue,
        JsonSerializer serializer)
    {
        if (reader.TokenType == JsonToken.Null)
        {
            throw new JsonSerializationException("Cannot unmarshal int");
        }

        var value = (string)reader.Value;
        const NumberStyles style = NumberStyles.AllowThousands;
        var result = int.Parse(value, style, CultureInfo.InvariantCulture);
        return result;
    }

    public override void WriteJson(JsonWriter writer, int value, JsonSerializer serializer)
    {
        writer.WriteValue(value);
    }
}

现在将[JsonConverter(typeof(ThousandsIntConverter))]属性添加到要转换的属性中。

即使该属性包含逗号,该属性也将被序列化,并且不带逗号将被反序列化。