我不能用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.
是否有解决此问题的解决方案?
由于
答案 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))]
属性添加到要转换的属性中。
即使该属性包含逗号,该属性也将被序列化,并且不带逗号将被反序列化。