【问题标题】:Parsing JSON rounds Negative Values解析 JSON 循环负值
【发布时间】:2015-04-25 06:08:18
【问题描述】:

我正在使用 NewtonSoft 的 JSON.NET 程序集在 C# 控制台应用程序中加载 .json 文件。我想我已经完成了大部分工作,除了我发现一些负浮点值正在四舍五入。

这里是相关代码;如您所见,我尝试了loadparse 两种方法,但结果相同。

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);

原来的值是这样的:

"geometry" : {  "rings" : [   [   [  -9221300.3411999997, 4120326.8838  ],
    [  -9221300.2146000005,  4120327.992399998  ]...

但是-9221300.3411999997rss 变量中变成类似于-9221300.3412 的东西,这导致坐标不起作用;长正值很好。

有没有办法保持足够高的精度(即,如果解析为double 而不是float,则应该有足够的数字)?

【问题讨论】:

  • 而不是解析为 JObject(在这种情况下可能使用不正确的类型,不知道正在选择哪个),而是创建一些与正确类型匹配的 json 对象树的类(不确定是 double 还是 float或十进制在这种情况下,可能是十进制?)并反序列化为?
  • 谢谢。如果发生这种情况,那么我将不得不加载 JObject 以外的东西,甚至可能在 JSON.NET 程序集之外完成大部分工作?
  • 您的问题是双浮点数缺乏精度。这不是 JSON.net 的问题,而是 double 类型的问题。
  • json.net 对用于存储值的类型做出了错误的决定。便便。解决方案是通过创建对象图来告诉它。只需创建类型并使用 json.net 进行反序列化。巴姆。没有问题。去吧,去做吧。
  • @Meengla:听起来你真的有比四舍五入更大的问题。如果您的代码在比较浮点数时依赖于该级别的精度,您可能应该修复 SQL 查询。在最好的情况下,比较浮点数是否相等通常是一个冒险的命题。

标签: c# json.net rounding


【解决方案1】:

安德鲁正确答案的一些代码:

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 中看不到“功能”属性。也许您应该更新您的问题/提出一个新问题?
  • Ondrej,确实,问题中没有类似的内容。首先,我必须获得完整的价值观。然而,现在,正如我上面的评论所说,在下一行代码中,我的 all_Features 变量不再起作用——这与上面完成的反序列化有关。我一直在寻找解决方案但找不到——我基本上需要获取“功能”节点
  • Ondrej:没关系——我昨晚忘了提到我确实找到了一种方法来使 All_Features 变量加载正确的数据......通过创建另一个类。抱歉信息错误。我刚刚对其进行了测试,它确实有效——新鲜的大脑会有所作为;)现在一切都很好——我想!再次感谢!!
【解决方案2】:

您需要使用 Decimal 类型而不是 Double 以保留该数量的有效数字。

【讨论】:

  • 谢谢。但是一旦将内容加载到 JObject 中,舍入就已经完成了——那我就不能对数据做任何事情了吗?
  • @Meengla Will 的评论也可能是一个答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-21
  • 2016-08-17
  • 1970-01-01
  • 1970-01-01
  • 2011-08-12
相关资源
最近更新 更多