当前位置: 首页 > 编程语言 > C#

处理Newtonsoft.Json中的小数值分享

时间:2023-04-10 11:57:43 C#

处理Newtonsoft.Json中的小数值这很简单。我在ModelBinder中有这个简单的代码:;它完美无瑕。好吧,有点。假设我有这个课程:publicclassMyClass{publicdecimalMyProp{get;放;如果我尝试反序列化这个json:“{"MyProp":9888.77}"当然它有效,因为9888.77是一个Javascript浮点值。我认为。但是我的页面中有一个屏蔽输入,使JSON看起来像这样(对不起我的英语):“{“MyProp”:“9.888,77”}”AAAND,它失败了。它说它Couldnotconvertstringtodecimal。好的,这很公平。它不是JS浮点数,但Convert.ToDecimal("9.888,77")以我想要的方式工作。我在互联网上阅读了一些关于自定义反序列化器的教程,但我可以为我的应用程序中的每个类定义一个自定义反序列化器。我想要的是简单地重新定义JSON.Net将字符串转换为十进制属性的方式,在我想要反序列化的任何类中。我想在小数转换期间注入Convert.ToDecimal函数,当前转换器不起作用。有什么办法可以做到吗?我认为有办法做到这一点,所以我更改了代码。JsonSerializerserializer=newJsonSerializer{NullValueHandling=NullValueHandling.Ignore,MissingMemberHandling=MissingMemberHandling.Ignore,Formatting=Formatting.None,DateFormatHandling=DateFormatHandling.IsoDateFormat,FloatParseHandling=FloatParseHandling.Decimal,};返回serializer.Deserialize(newDecimalReader(jsonStr),bindingContext.ModelType);并创建了这个类:publicclassDecimalReader:JsonTextReader{publicDecimalReader(strings):base(newStringReader(s)){}publicoverridedecimal?ReadAsDecimal(){尝试{returnbase.ReadAsDecimal();}catch(Exception){if(this.TokenType==JsonToken.String){十进制值=0;boolconvertible=Decimal.TryParse(this.Value.ToString(),输出值);if(convertible){returnnewNullable(value);}else{扔;}}else{扔;但它非常丑陋:它只在崩溃时执行我想要的操作,并且依赖于base.ReadAsDecimal()来崩溃。再丑不过了。并且不起作用:将值“1.231,23”转换为类型“System.Nullable1[System.Decimal]”时出错。路径“MyProp”,X行,Y位置。将值“1.231,23”转换为类型“System.Nullable1[System.Decimal]'。路径“MyProp”,X行,Y位置。值本身正在转换,但可能出于某种原因它仍在尝试将字符串“1.231,23”放入小数。那么,有没有办法正确地做到这一点?您可以使用像这样的自定义JsonConverter类来处理这两种格式(JSON数字表示和屏蔽字符串格式)。classDecimalConverter:JsonConverter{publicoverrideboolCanConvert(TypeobjectType){return(objectType==typeof(decimal)||objectType==typeof(decimal?));}publicoverrideobjectReadJson(JsonReaderreader,TypeobjectType,objectexistingValue,JsonSerializerserializer){JTokentoken=JToken.Load(reader);如果(token.Type==JTokenType.Float||token.Type==JTokenType.Integer){returntoken.ToObject();}if(token.Type==JTokenType.String){//自定义它以满足您的需要returnDecimal.Parse(token.ToString(),System.Globalization.CultureInfo.GetCultureInfo("es-ES"));}if(token.Type==JTokenType.Null&&objectType==typeof(decimal?)){returnnull;}thrownewJsonSerializationException("意外的令牌类型:"+token.Type.ToString());}publicoverridevoidWriteJson(JsonWriterwriter,objectvalue,JsonSerializerserializer){thrownewNotImplementedException();}}要将其插入到活页夹中,只需要将转换工具的实例添加到JsonSerializerSett在ings对象的Converters列表中:JsonSerializerSettingssettings=newJsonSerializerSettings{NullValueHandling=NullValueHandling.Ignore,MissingMemberHandling=MissingMemberHandling.Ignore,Formatting=Formatting.None,DateFormatHandling=DateFormatHandling.IsoDateFormat,Converters}{verynew;DecimalListver}(很新)谢谢!我一直在寻找一种解决方案,使小数始终以类似的方式序列化,这篇文章让我朝着正确的方向前进这是我的代码:以上就是C#学习教程:处理Newtonsoft.Json中的十进制值的全部内容。如果对大家有用,需要进一步了解C#学习教程,希望大家多加关注—internalclassDecimalConverter:JsonConverter{publicoverrideboolCanConvert(TypeobjectType){return(objectType==typeof(decimal)||objectType==typeof(decimal?));}publicoverrideobjectReadJson(JsonReaderreader,TypeobjectType,objectexistingValue,JsonSerializerserializer){thrownewNotImplementedException();}publicoverridevoidWriteJson(JsonWriterwriter,objectvalue,JsonSerializerserializer){十进制?d=默认值(十进制?);if(value!=null){d=valueasDecimal?;if(d.HasValue)//如果值是小数?那么这是可能的{d=newDecimal?(newDecimal(Decimal.ToDouble(d.Value)));//ToDouble转换移除所有不必要的精度}}JToken.FromObject(d).WriteTo(writer);}}本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: