c# – 处理Newtonsoft.Json中的十进制值
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c# – 处理Newtonsoft.Json中的十进制值,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3890字,纯文字阅读大概需要6分钟。
内容图文
![c# – 处理Newtonsoft.Json中的十进制值](/upload/InfoBanner/zyjiaocheng/711/3c43dce6a1d749b6ac81bc3e3bc4978a.jpg)
编辑:已经差不多5年了,我不认为这是要走的路.客户端应以正确的数字格式发布数据.使用当前的框架,如React或Angular,或具有适当的架构和错误处理&验证,我认为这几乎不是问题.
但是如果有人想要展示他们的Json.NET肌肉,请随时查看答案.
我有一个MVC应用程序,我在其中处理一些JSON.这很简单.我在ModelBinder中有这么简单的代码:
return JsonConvert.DeserializeObject(jsonString, bindingContext.ModelType, new JsonSerializerSettings
{
NullValueHandling = NullValueHandling.Ignore,
MissingMemberHandling = MissingMemberHandling.Ignore,
Formatting = Formatting.None,
DateFormatHandling = DateFormatHandling.IsoDateFormat,
FloatParseHandling = FloatParseHandling.Decimal
});
它完美无瑕.
好吧,有点.
假设我有这个课程:
public class MyClass
{
public decimal MyProp { get; set; }
}
如果我尝试反序列化这个json:
"{\"MyProp\": 9888.77}"
当然它可以工作,因为9888.77是一个Javascript浮点值.我认为.
但是我的页面中有一个屏蔽输入,使得JSON看起来像这样(对不起我的英文):
"{\"MyProp\": \"9.888,77\" }"
AAAND,它失败了.它说它无法将字符串转换为十进制.
好的,这很公平.它不是JS浮点数,但Convert.ToDecimal(“9.888,77”)以我想要的方式工作.
我在互联网上阅读了一些关于自定义反序列化器的教程,但是我可以为我的应用程序中的每个类定义一个自定义反序列化器.
我想要的是简单地重新定义JSON.Net将字符串转换为十进制属性的方式,在任何我想要反序列化的类中.我想在转换小数的过程中注入Convert.ToDecimal函数,当前转换器不起作用.
有没有办法可以做到?
我认为有办法做到这一点,所以我改变了我的代码.
JsonSerializer serializer = new JsonSerializer
{
NullValueHandling = NullValueHandling.Ignore,
MissingMemberHandling = MissingMemberHandling.Ignore,
Formatting = Formatting.None,
DateFormatHandling = DateFormatHandling.IsoDateFormat,
FloatParseHandling = FloatParseHandling.Decimal,
};
return serializer.Deserialize(new DecimalReader(jsonStr), bindingContext.ModelType);
并创建了这个类:
public class DecimalReader : JsonTextReader
{
public DecimalReader(string s)
: base(new StringReader(s))
{
}
public override decimal? ReadAsDecimal()
{
try
{
return base.ReadAsDecimal();
}
catch (Exception)
{
if (this.TokenType == JsonToken.String)
{
decimal value = 0;
bool convertible = Decimal.TryParse(this.Value.ToString(), out value);
if (convertible)
{
return new Nullable<decimal>(value);
}
else { throw; }
}
else
{
throw;
}
}
}
}
但它非常难看:它只在崩溃时执行我想要的东西,并依赖于base.ReadAsDecimal()崩溃.它不可能更难看.
并且不起作用:将值“1.231,23”转换为类型’System.Nullable1 [System.Decimal]’时出错.路径’MyProp’,X行,Y位置.
值本身正在转换,但也许由于某种原因,它仍然试图将字符串“1.231,23”放入小数.
那么,有没有办法正确地做到这一点?
解决方法:
您可以使用像这样的自定义JsonConverter类来处理这两种格式(JSON编号表示和屏蔽字符串格式).
class DecimalConverter : JsonConverter
{
public override bool CanConvert(Type objectType)
{
return (objectType == typeof(decimal) || objectType == typeof(decimal?));
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
JToken token = JToken.Load(reader);
if (token.Type == JTokenType.Float || token.Type == JTokenType.Integer)
{
return token.ToObject<decimal>();
}
if (token.Type == JTokenType.String)
{
// customize this to suit your needs
return Decimal.Parse(token.ToString(),
System.Globalization.CultureInfo.GetCultureInfo("es-ES"));
}
if (token.Type == JTokenType.Null && objectType == typeof(decimal?))
{
return null;
}
throw new JsonSerializationException("Unexpected token type: " +
token.Type.ToString());
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
throw new NotImplementedException();
}
}
要将其插入到活页夹中,只需将转换器的实例添加到JsonSerializerSettings对象的Converters列表中:
JsonSerializerSettings settings = new JsonSerializerSettings
{
NullValueHandling = NullValueHandling.Ignore,
MissingMemberHandling = MissingMemberHandling.Ignore,
Formatting = Formatting.None,
DateFormatHandling = DateFormatHandling.IsoDateFormat,
Converters = new List<JsonConverter> { new DecimalConverter() }
};
内容总结
以上是互联网集市为您收集整理的c# – 处理Newtonsoft.Json中的十进制值全部内容,希望文章能够帮你解决c# – 处理Newtonsoft.Json中的十进制值所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。