gpt4 book ai didi

powershell - 为什么这个新的JObject添加到我的字符串时会奇怪地更改它?

转载 作者:行者123 更新时间:2023-12-03 01:17:49 25 4
gpt4 key购买 nike

我有一个PowerShell脚本,其目的是将传入的JSON对象转换为另一种JSON对象。 (“为什么”不在此问题的范围内。)脚本(到目前为止)在下面(URL被混淆,将不起作用):

function Map-TempStudents {
param($uffStudent) # JObject containing UFF-formatted student

[String]$districtCode = $uffStudent.Item("DistrictCode").ToString()
Write-Host "districtCode = " $districtCode

$tempStudent = New-Object -TypeName Newtonsoft.Json.Linq.JObject
$tempStudent.Add("DistrictNum", $uffStudent.Item("DistrictCode").ToString())

Write-Host "tempStudent(DistrictNum) = " $tempStudent.Item("DistrictNum").ToString()
}

$currentPath = Split-Path -parent $MyInvocation.MyCommand.Definition
$jsonNetPath = $currentPath + '\Newtonsoft.Json.dll'
Add-Type -Path $jsonNetPath

$wc = New-Object system.Net.WebClient;
$studentPersonal = $wc.downloadString("http://test.foo.org/StudentPersonal")
$json = [Newtonsoft.Json.Linq.JObject]::Parse($studentPersonal)

$studentPersonal | Out-File "test.txt" # DEBUG

$studentBases = $json.Item("Data").Item("AssignTeacher")
Map-TempStudents -uffStudent $studentBases[0]

运行此脚本将给出以下输出:
districtCode =  0745
tempStudent(DistrictNum) = 485

需要明确的是,“0745”是正确的值,“485”是意外的值。

我希望tempStudent(DistrictNum)也为“0745”。

为什么这个值会这样变化?

最佳答案

我可以使用以下脚本来重现您的问题(假设Newtonsoft.Json.dll已加载到PowerShell中):

$jo = New-Object -TypeName Newtonsoft.Json.Linq.JObject
$jo.Add("foo", "0745")
Write-Host $jo.Item("foo").ToString()
Add上的 JObject方法接受 object作为第二个参数。如果传递的数字字符串的前导零(所有数字均小于8),则将其解释为八进制数字。因此,“0745”被转换为“485”。这必须是PowerShell的事情,因为C#中的等效代码可以正常工作:
JObject jo = new JObject();
jo.Add("foo", "0745");
Console.WriteLine(jo["foo"].ToString());

为了防止在PowerShell中进行不必要的转换,请在将字符串传递给 JValue之前将其包装在 JObject.Add()中,例如:
$jval = New-Object -TypeName Newtonsoft.Json.Linq.JValue -ArgumentList "0745"
$jo.Add("foo", $jval)

这是更正的 Map-TempStudents函数:
function Map-TempStudents {
param($uffStudent) # JObject containing UFF-formatted student

$districtCode = New-Object -TypeName Newtonsoft.Json.Linq.JValue -ArgumentList $uffStudent.Item("DistrictCode").ToString()
Write-Host "districtCode = " $districtCode.ToString()

$tempStudent = New-Object -TypeName Newtonsoft.Json.Linq.JObject
$tempStudent.Add("DistrictNum", $districtCode)

Write-Host "tempStudent(DistrictNum) = " $tempStudent.Item("DistrictNum").ToString()
}

关于powershell - 为什么这个新的JObject添加到我的字符串时会奇怪地更改它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24686301/

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