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

标签 powershell json.net

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

相关文章:

powershell - 如何将环境变量传递给解决方案构建步骤(Build vNext)

nhibernate - NHibernate 代理的 JSON.Net 序列化 (NH 3.3.2.4000)

c# - Newtonsoft JSON.NET 反序列化错误

powershell - 如何开始我刚刚定义的功能的工作?

powershell - 将两次或多次调用 Get-ChildItem 的结果加入一个数组的最简洁方法是什么?

Powershell 脚本作为可执行文件给出 "wrong",在 Bamboo 中给出返回码 -1

Azure DevOps 条件无法评估 Powershell 设置变量

c# - 在 Newtonsoft.Json 中反序列化自定义异常

c# - 如何在dotnet core中将动态对象序列化为JSON字符串?

c# - 将 JSON 反序列化为 List<T> 时出错