将对象从JSON转换为float

时间:2018-09-06 12:38:09

标签: c# json casting

在项目中创建JSON设置文件时遇到了一件非常奇怪的事情。 globalSettings是一个存储许多设置的容器。

在属性PreHeight中,我将新值存储到globalSetting(这些设置将在应用程序退出时持久保存到json文件中)。为了清楚起见,我什至明确地使用了“值”(并非真正需要)。

globalSettings["PreHeight"] = (float)value;

当我尝试在启动时重新加载设置时,我首先尝试了以下代码。

   PreHeight = (float)globalSettings["PreHeight"];

令我惊讶的是,它引发了无法强制转换的异常。然后,我只是将行更改为使用语言中立方法Convert.ToSingle()。在后台,它应该执行完全相同的类型转换。令我惊讶的是,使用Convert.ToSingle()方法时,代码行没有抛出。

   PreHeight = Convert.ToSingle(globalSettings["PreHeight"]);

有人可以解释这种奇怪的行为吗?

我很清楚JSON以最简单的数据类型保存,因此0被视为整数,但是到底为什么将其强制转换为浮点数呢?

2 个答案:

答案 0 :(得分:0)

开凿脑袋后,我得出一个结论,即您的框架仅返回一个对象(而不是字符串或浮点数)。

因为它不是字符串,所以请浮动。解析失败。

由于它是一个对象,并且CLR假定它是Double Precision浮点数(默认),因此Typecast运算符由于可能会损失精度而无法对其进行转换。这就是类型转换运算符无法工作的方式。替代代码可能是

 PreHeight = (float) ((double)(globalSettings["PreHeight"]);

Convert.ToSingle是负责将Double Precision转换为Single Precision的人,并且效果很好。

 PreHeight = Convert.ToSingle(globalSettings["PreHeight"]);

是处理此转换的唯一权利。

答案 1 :(得分:0)

如果通过索引globalSettings返回的值是一个字符串,则无法将string强制转换为floatConvert.ToSingle在内部使用Single.Parse。这就是它起作用的原因,也是您应该使用的:

using System;

PreHeight = Single.Parse(globalSettings["PreHeight"]);
// or
PreHeight = float.Parse(globalSettings["PreHeight"]);