我有一个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/