2

我正在 PowerShell 中处理 JSON 文件,并且似乎 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,在处理过程中验证正确的 i/o 时弄乱了我的哈希值。

这是预期的行为(可能是区域设置)吗?ConvertFrom-Json 是否有设置让我的输入单独用于输出?

4

1 回答 1

3

问题在于 PowerShell 的 JSON 库输出 CLR 浮点数的方式。通过从 JSON 转换,您可以将 JSON 字符串转换为具有数字和字符串等相关类型的 CLR/PowerShell 对象。转换回 JSON 将该对象序列化回 JSON,但使用 .NET 默认格式化程序配置来执行此操作。原始 JSON 文档中没有元数据来帮助转换。舍入错误和截断,元素的不同顺序也可能在这里发生。

规范形式(散列时要使用的形式)的 JSON 规范如下:

必须以指数符号表示所有非整数

  • 包括一个非零个位有效整数部分,以及
  • 包括一个非空的有效小数部分,和
  • 在有效小数部分不包括尾随零(作为满足前一点所需的“.0”的一部分除外),和
  • 包括大写“E”,以及
  • 包括指数中没有加号,和
  • 指数中不包括无关紧要的前导零

来源:https ://gibson042.github.io/canonicaljson-spec/

尽管 JSON 的规范支持这两个选项(eE)。

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

资料来源:https ://www.crockford.com/mckeeman.html

您可以直接使用 Newtonsoft.Json 类并传入自定义转换器将对象转换为 JSON。

更好的解决方案可能是使用专门的格式化程序组件,该组件直接操作现有的 JSON 文档,而无需先将其转换为 CLR 对象。

于 2020-01-11T16:03:42.163 回答