gpt4 book ai didi

json - Powershell 两个json内容为什么不一样?

转载 作者:行者123 更新时间:2023-12-01 13:23:40 24 4
gpt4 key购买 nike

我有两个 Byte[] 类型的变量(我选择这种类型是为了特定的需要,所以它需要保留。)声明为:

$first = New-Object Byte[] 32
$second = New-Object Byte[] 32

并且,我初始化了两个变量的每个索引。

现在,我创建了一个哈希表 $List1 作为:

$List1=@{"First" = $first; "Second" = $second}

我使用以下语法创建 json 文件:

$List1 | ConvertTo-Json | Set-Content  -Path $jsonFile1

这是第一个json文件内容:

{
"First": {
"value": [
210,
195,
131,
176,
88,
154,
57,
37,
2,
75,
182,
190,
156,
43,
113,
199,
63,
25,
109,
92,
220,
91,
219,
252,
113,
68,
202,
12,
147,
194,
36,
177
],
"Count": 32
},
"Second": {
"value": [
238,
225,
12,
172,
134,
94,
42,
204,
27,
78,
39,
166,
229,
111,
143,
254
],
"Count": 16
}
}

然后我将第一个 json 文件读取到一个临时变量中,如下所示:

$tempHash = Get-Content -Path $jsonFile1 -Raw| ConvertFrom-Json

由于 $tempHash 是一个 PSCustomObject,我创建了一个新的哈希表 $List2,如下所示:

$List2 = @{"First" = $tempHash.First.value; "Second"= $tempHash.Second.value}

我用它来创建第二个 json 文件,如下所示:

$List2 | ConvertTo-Json | Set-Content  -Path $jsonFile2

这是第二个json文件内容:

    {
"First": [
133,
231,
19,
173,
60,
50,
105,
68,
38,
109,
99,
155,
2,
188,
216,
9,
8,
225,
203,
15,
167,
8,
188,
76,
192,
154,
183,
194,
1,
122,
143,
137
],
"Second": [
27,
3,
57,
67,
155,
145,
181,
194,
250,
10,
65,
90,
41,
230,
243,
196
]
}

我使用相同的语法来创建这两个 json 文件。那么,为什么它们的结构不同呢?

[编辑]

我怀疑,不同之处在于这种语法:

$List1=@{"First" = $first; "Second" = $second}

因为 Byte[] 类型变量不能像简单的 integer[] 类型变量那样工作。纠正我。

[编辑]

所以,事实证明 Byte[] 类型变量有两个不同的键。“值”,它保存实际的字节值数组,以及“Count”,保存 Byte[] 变量中元素的数量。 但是,当我们像这样调用 Byte[] 类型变量时:

$first

它是 Byte[] 类型,我们只得到“value”键下列出的值。 “count”键下的值永远不会显示在控制台中,但它会以某种方式传递给哈希表。

还有一点需要注意。如果我使用:

 $List2 = @{"First" = $tempHash.First; "Second"= $tempHash.Second}

然后,我将不得不使用:

$List2.First.Value #to get the value of the "First" key

这让我感到不舒服,因为对于 $List1 哈希表,我只需要使用:

 $List1.First #to get the value of the "First" key.

[解决方法]

我创建了一个 hastable $List 作为原始哈希表,如下所示,严格仅一次性使用:

$List | ConvertTo-Json | Set-Content  -Path $jsonFile

然后,我从上面的原始 $jsonFile 创建了两个 hastables $List1$List2,如下所示。

 $tempHash = Get-Content -Path $jsonFile -Raw| ConvertFrom-Json
$List1 = @{"First" = $tempHash.First; "Second" = tempHash.Second}
$List2 = @{"First" = $tempHash.First; "Second" = tempHash.Second}

它帮助我在引用它们的键和值时保持一致性。

现在,我用

#to fetch the values of the "First" keys of both hashtables.
$List1.First.value #and
$List2.First.value

同样,我对哈希表 $List1$List2 的“第二”键执行相同的操作。

#to fetch the values of the "Second" keys of both hashtables.
$List1.Second.value #and
$List2.Second.value

[编辑]

事实证明这是我的 Powershell 版本中的一个错误,如下面的 @mklement0 所指出的。完美的解决方案是按照@mklement0 的指示使用以下语法:

# Ensure that the input array is constructed without the extra [psobject] wrapper.
$First = [Byte[]]::new(32)
$Second = [Byte[]]::new(32)

最佳答案

  • 第一个 ConvertTo-Json 调用的结果是 Windows PowerShell v5.1 中的一个怪癖 : 生成的 JSON 应该有 FirstSecond 包含一个数组直接而不是一个对象Count 属性,value 包含数组。

    • 此行为已fixed in PowerShell Core ;它可能会或可能不会在 Windows PowerShell(从 v5.1 开始仍然存在)中得到修复。
      $a = New-Object Byte[] 2; @{ a = $a } | ConvertTo-Json -Compress 产生:
      • {"a":[0,0]} 在 PowerShell Core v6.0.1 中 - 确定。
      • {"a":{"value":[0,0],"Count":2}} 在 Windows PowerShell v5.1 中 - 损坏。
  • 在您的情况下,New-Object 的使用触发了怪癖

    • 很可能与 this issue 有关;但请注意,该问题在 PowerShell Core 中也未得到解决,但与上述链接的修复解决了此上下文中的问题。

解决方法:

在您的脚本/ session 开始时,运行:

Remove-TypeData System.Array

这从所有数组对象中删除了 ETS 提供的过时的 .Count 属性,这使得 [psobject] 包装的对象(例如返回的对象)的问题消失了New-Object) - 有关解释,请参阅 this answer我的。


更麻烦的解决方法:

如果您确保 -is [psobject] 不再为输入数组报告 true,问题就会消失,这可以通过以下方式之一完成:

  • [PSv5+]: $First = [Byte[]]::new(32) - 使用表达式而不是命令会产生问题走开,因为它不会创建额外的、不可见的 [psobject] 包装器。

  • [PSv4-]: $First = (New-Object Byte[] 32).psobject.BaseObject - 显式绕过额外的 [psobject] 包装器让问题消失。

简化示例(PSv5+,但很容易适应早期版本;省略了文件操作,因为它们是问题的附带因素):

# Ensure that the input array is constructed without the extra [psobject] wrapper.
$First = [Byte[]]::new(2)

# Construct a hashtable...
$List1 = @{ First = $first }
# ... and convert it to JSON:
($json = $List1 | ConvertTo-Json)

上面的代码现在正确地产生了(没有具有valuecount 属性的无关对象):

{
"First": [
0,
0
]
}

现在可以按预期将此 JSON 字符串重新转换为对象:

# Re-convert: $tempObj.First then *directly* contains the input array
# (there is no .Value property anymore).
$tempObj = $json | ConvertFrom-Json

# Construct a new hashtable...
$List2 = @{ First = $tempObj.First }
# ... and convert it to JSON.
$List2 | ConvertTo-Json

结果是与上面相同的 JSON 字符串。

关于json - Powershell 两个json内容为什么不一样?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48841191/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com