ConvertFrom- Json преобразование строчных букв в прописные (иногда) - PullRequest
2 голосов
/ 11 января 2020

Я обрабатываю JSON файлы в PowerShell, и кажется, что ConvertFrom- Json изменяет регистр на своих входах только в некоторых (редких) случаях.

Например, когда я делаю:

$JsonStringSrc = '{"x":2.2737367544323206e-13,"y":1759,"z":33000,"width":664}' 
$JsonStringTarget = $JsonStringSrc | ConvertFrom-Json | ConvertTo-Json -Depth 100 -Compress
$JsonStringTarget 

Возвращает:

{"x":2.2737367544323206E-13,"y":1759,"z":33000,"width":664}

Нижний регистр e стал верхним регистром E, путая мои хэши при проверке правильного ввода / вывода во время обработки.

Это ожидаемое поведение (возможно, региональная обстановка)? Есть ли настройка для ConvertFrom- Json, чтобы оставить мои входы одними для вывода?

1 Ответ

3 голосов
/ 11 января 2020

Проблема заключается в том, что библиотека PowerShell JSON выводит числа точек с плавающей точкой CLR. Преобразуя из JSON, вы превращаете строку JSON в объект CLR / PowerShell со связанными типами для чисел и строк и тому подобное. Преобразование обратно в JSON сериализует этот объект обратно в JSON, но для этого используется конфигурация форматера по умолчанию. NET. Нет метаданных из оригинального документа JSON, чтобы помочь преобразованию. Здесь также могут возникать ошибки округления и усечения, различный порядок элементов.

JSON spe c для канонической формы (форма, которую вы хотите использовать при хешировании) выглядит следующим образом:

ДОЛЖЕН представлять все нецелые числа в экспоненциальной записи

  • , включая ненулевую целую часть с единичным ди git и
  • , включая непустую значащую дробную часть, и
  • , включая отсутствие конечных нулей в значащей дробной части (кроме как в виде «.0», необходимого для удовлетворения предыдущего пункта), и
  • , включая заглавную «E» »И
  • , включая знак плюс в показателе степени, и
  • , включая незначительные начальные нули в показателе степени

Источник: https://gibson042.github.io/canonicaljson-spec/

Хотя спецификации для JSON поддерживают оба варианта (e и E).

exponent
   ""
   'E' sign digits
   'e' sign digits

Источник: https://www.crockford.com/mckeeman.html

Вы можете преобразовать объект в * 106 1 * используя классы Newtonsoft. Json напрямую и передавая пользовательский конвертор.

Лучшим решением, вероятно, будет использование специализированного компонента форматирования, который напрямую манипулирует существующим документом JSON без преобразования сначала к объектам CLR.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...