Parsing JSON rounds Negative Values
我正在使用NewtonSoft的json.net程序集在C控制台应用程序中加载.json文件。我想我已经完成了大部分的工作,除了我发现一些负的浮点值正在四舍五入。
这是相关的代码;正如您所看到的,我尝试过load和parse两种方法,但结果相同。
1 2 3 4 5 6 7 8
| string content ;
using (StreamReader reader = new StreamReader ("C:\\[Path]\brackett_full_room.json"))
{
content = reader .ReadToEnd();
}
//// JObject rss = JObject.Load(reader);
JObject rss = JObject .Parse(content ); |
原始值如下:
1 2
| "geometry" : { "rings" : [ [ [ -9221300.3411999997, 4120326.8838 ],
[ -9221300.2146000005, 4120327.992399998 ]... |
但是,-9221300.3411999997在rss变量中变成了类似-9221300.3412的东西,这导致坐标不起作用;长的正值很好。
是否有办法保持足够高的精度(即,如果解析为double而不是float,应该有足够的数字)?
- 不要解析为jobject(在这种情况下可能使用不正确的类型,选择的是dunno),而是创建一些与JSON对象树匹配并正确键入的类(不确定在这种情况下是double、float还是decimal,可能是decimal?)然后反序列化?
- 谢谢。如果发生这种情况,那么我将不得不加载到jobject之外的东西中,甚至可能要在json.net程序集之外完成大部分工作?
- 您的问题是缺少双浮点数的精度。这不是json.net问题,而是double类型的问题。
- 马特:我无法控制输入的JSON文件,新手用户将输出该文件以供C应用程序使用。这可能不是json.net的问题,但我必须以某种方式将数据"读取"到程序中,然后对数据进行按摩。
- 一些有用的链接:我如何在小数和双精度之间进行选择,每个计算机科学家都应该知道关于浮点运算的内容
- json.net对用于存储值的类型做了错误的决定。便便。解决方案是通过创建对象图来告诉它。只需创建类型并使用json.net反序列化即可。BAM。没有问题。去吧,去做。
- 旁注:"这导致坐标不起作用"-浮点/双精度值不精确-如此小的变化不应真正影响任何东西。确保正确处理浮点数,即不能在常规意义上与==比较"相等"(实质上是"位相同",而不是"基本上表示相同的值")。
- 好吧,威尔。我会调查的。谢谢。
- Alexei:SQL Server查询中的值被拒绝,因为空间函数抱怨某些"外部"环不匹配。很肯定,即使是分数不匹配也会造成问题。
- @米恩格拉:那听起来你的问题真的比一个四舍五入更大。如果您的代码在比较浮点数时依赖于该精度级别,那么您可能应该修复SQL查询。比较浮点数的相等性通常是一个骰子命题在最好的时候。
- Matt,我不是100%确定,但我认为SQL Server的空间函数几何体::stpolyFromText几乎肯定在寻找这样的精度;一旦我解决了这个舍入问题,我将了解更多。
安德鲁正确答案的一些代码:
1 2 3 4
| var settings = new JsonSerializerSettings ();
settings .FloatParseHandling = FloatParseHandling .Decimal;
string json = @"{""rings"" : [ -9221300.3411999997, 4120326.8838 ] }";
var rss = JsonConvert .DeserializeObject(json, settings ); |
- 一个快速而肮脏的解决方案,但是我仍然认为创建自己的类型来反序列化到(如@will建议的)是一个更干净的解决方案。
- 我已经部分实现了这个解决方案,应该可以使用,但是var all_features=(jarray)rss["features"];现在给出了一个错误:"错误1不能将带[]的索引应用于类型为"object"的表达式。"
- @Meengla-我在您的JSON中没有看到"features"属性。也许你应该更新你的问题/提出一个新的问题?
- 事实上,昂德雷吉在这个问题上没有类似的东西。首先,我必须得到完整的价值观。但是,现在,正如我上面的评论所说,在接下来的代码行中,我的all_features变量不再工作——这与上面所做的反序列化有关。我已经寻找了一个解决方案,但找不到--我基本上需要得到"功能"节点
- 恩德里克:没关系——我昨晚晚些时候忘了提,我确实找到了一种方法,通过创建另一个类,让所有的特性变量加载正确的数据。对不起,我的信息有误。我刚测试过它,它很管用——新鲜的大脑会有所不同;)所以现在一切都很好——我想!再次感谢!!
为了保持有效数字的数量,需要使用十进制类型而不是双精度类型。
- 谢谢。但一旦将内容加载到jobject舍入中,就已经完成了——那么我就不能对数据做任何操作了?
- @米恩格拉·威尔的评论也可能是一个答案。