gpt4 book ai didi

json - 使用Powershell从Json结构提取值时出现问题

转载 作者:行者123 更新时间:2023-12-02 23:19:38 25 4
gpt4 key购买 nike

使用Powershell,我得到了一个返回到我的First变量中的json代码片段(它总是可以正常工作);

# Initialise variables...
$nMessage_id = "";
$whatStatusJsonContent = "";
# Function https://abc.googleapis.com/abc/load call here and returns...
$whatStatusJsonContent = '{"message_id":9093813071099257562}'

然后,我将convert函数调用为一个临时变量,如下所示:
$ResponseBody = ConvertFrom-Json $whatStatusJsonContent;

这使Json变成了一个很好的小数据结构,例如:
         message_id
----------
9093813071099257562

通过调用它,可以从中选择所需的值。
$nMessage_id = $ResponseBody.message_id;

通常,这可以正常工作,我将值放入第二个变量;
$nMessage_id = 9093813071099257562

问题是:有时即使$ whatStatusJsonContent确实记录为已从函数正确返回Json,也无法在$ nMessage_id中得到任何信息。

我的问题是:是否必须使用ConvertFrom-Json,还是可以从First变量中原始读取它?

组合解决方案:感谢@mklement()和@ Bernard-Moeskops
# Initialise variables...
$nMessage_id = "";
$whatStatusJsonContent = "";
# Function https://abc.googleapis.com/abc/load call here and returns...
$whatStatusJsonContent = '{"message_id":9093813071099257562}'

$ResponseBody = ConvertFrom-Json $whatStatusJsonContent;

if($ResponseBody.message_id){
# ConvertFrom-Json got the value!
$nMessage_id = $ResponseBody.message_id
}else{
# ConvertFrom-Json didn't work!
$nMessage_id = = ($whatStatusJsonContent -split '[:}]')[1]
}

最佳答案

您的代码没有任何明显的错误。

ConvertFrom-Json 应该可以正常工作,并返回带有[pscustomobject]属性的.message_id实例。

在您的示例中,message_id JSON属性值是一个整数,ConvertTo-Json会为它自动选择一个合适的整数数据类型,如下所示:最小的有符号类型> = [int](System.Int32)[1]可以容纳该值([int] -> [long](System.Int64)-> [decimal](System.Decimal));需要注意的是,如果该值甚至不能适合[decimal],则使用-不精确-[double]。[2]

在您的问题中使用示例JSON时,选择了[long]

在后续评论中,您声明:

The routine makes over 1000 calls/hour and for most of them the Json comes back and the $nMessage_id is yielded perfectly. Then, suddenly, the $nMessage_id is empty, even though the Json is logged as coming back fine. So, somewhere in the ConvertFrom-Json or $ResponseBody.message_id the value is going missing...



我没有任何解释,但是如果出于某种原因 ConvertFrom-Json是罪魁祸首,您可以 尝试将字符串操作作为一种变通方法来提取消息ID,看看是否有帮助:
$whatStatusJsonContent = '{"message_id":9093813071099257562}'

# Extract the message_id property value as a *string*
# (which you can cast to a numeric type if/as needed).
$message_id = ($whatStatusJsonContent -split '[:}]')[1]

上面的代码在 9093813071099257562中存储了一个内容为 $message_id的字符串;请注意,按照书面要求,输入字符串必须具有与上述空格相同的确切格式;尽管可以使文本解析更加健壮,但不必担心格式变化是使用专用解析器(例如 ConvertFrom-Json)的一个很好的理由。

另一个选择是 尝试使用其他JSON解析器来查看是否有帮助。
Json.NET是.NET世界中杰出的JSON解析器(现在是PowerShell Core中JSON cmdlet的基础):
$whatStatusJsonContent = '{"message_id":9093813071099257562}'

$message_id = [NewtonSoft.Json.Linq.JObject]::Parse($whatStatusJsonContent).message_id.Value

注意:Json.NET-类似于PowerShell _Core中的 ConvetFrom-Json-当数字太大而无法容纳 [bigint]时,建议使用任意大的 [long]类型。

ConvertFrom-Json cmdlet相比,使用Json.NET程序集具有更好的性能。

在PowerShell Core中,您可以按原样运行上述代码(程序集已预加载);在Windows PowerShell中,您必须通过上面的链接下载程序包,并使用 NewtonSoft.Json.dll将程序集( Add-Type -LiteralPath)添加到 session 中。

[1]奇怪的是,在PowerShell Core中,至少(从v6.2.0开始),选择的最小类型是 [long]( System.Int64)。

[2]更有用的是,从(至少)v6.2.0版本开始,PowerShell Core在值不再适合 [bigint]的情况下创建任意大的 System.Numerics.BigInteger( [long])实例;也就是说,完全跳过了 [decimal]类型。

关于json - 使用Powershell从Json结构提取值时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54977018/

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