2015-02-23 4 views
1

Я использую Json.NET сборки NewtonSoft, чтобы загрузить файл .json в C# консольное приложение. Я думаю, что я выполнил большую часть работы, кроме того, что обнаружил, что некоторые отрицательные значения float округляются.Разбор JSON округляет отрицательные значения

Вот соответствующий код; как вы можете видеть, я пробовал и методы load, и parse, но те же результаты.

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.3411999997 становится чем-то вроде -9221300.3412 в переменной rss, и это вызывает координаты, чтобы не работать; длинные положительные значения прекрасны.

Есть ли способ сохранить точность достаточно высоко (то есть должно быть достаточно цифр, если проанализировано как double вместо float)?

+2

Вместо анализа на JObject (который может использовать неправильные типы для этого случая, Незнайка, который выбирается), создать несколько классов, которые соответствуют дерево объектов JSON с правильная типизация (не уверен, что двойной или плавающий или десятичный в этом случае, возможно, десятичный?) и десериализовать на это? – Will

+0

Спасибо. Если это произойдет, мне придется загружать в нечто иное, чем JObject, и, возможно, даже большую часть работы удаляю из сборки JSON.NET? – IrfanClemson

+1

Ваша проблема заключается в отсутствии точности в числах с двойной плавающей запятой. Это не проблема JSON.net, это проблема с типом [double] (https://msdn.microsoft.com/en-us/library/678hzkk9.aspx). –

ответ

6

Некоторые код правильный ответ Андрея:

var settings = new JsonSerializerSettings(); 
settings.FloatParseHandling = FloatParseHandling.Decimal; 
string json = @"{ ""rings"" : [ -9221300.3411999997, 4120326.8838 ] }"; 
var rss = JsonConvert.DeserializeObject(json, settings); 
+1

Хорошее быстрое и грязное решение, но я по-прежнему считаю, что создание вашего собственного типа для десериализации (как предлагается @will) является более чистым решением. –

+0

Я частично реализовал это решение и должен работать, но var all_Features = (JArray) rss ["features"]; теперь дает ошибку: «Ошибка Невозможно применить индексирование с [] к выражению типа« объект » – IrfanClemson

+0

@Meengla - я не вижу свойства« особенностей »в вашем json. Может быть, вам стоит обновить свой вопрос/пожарить новый? –

2

Вы должны использовать десятичный тип вместо Double для того, чтобы сохранить это число значащих цифр.

+0

Спасибо.Но как только содержимое загружается в округление JObject, уже сделано - я ничего не могу сделать с данными? – IrfanClemson

+2

комментарий @Meengla Will может быть ответом. –

Смежные вопросы