使用Powershell从Json结构中提取值的问题

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (281)

使用Powershell,我将一个json片段返回到我的First变量中(这总是很好);

# Initialise variables...
$nMessage_id = "";
$whatStatusJsonContent = "";
# Function call here...
$whatStatusJsonContent = '{"message_id":9093813071099257562}'

然后我将convert函数调用为这样的临时变量;

$ResponseBody = ConvertFrom-Json $whatStatusJsonContent;

这使得Json成为一个像这样的漂亮的小数据结构;

         message_id
         ----------
9093813071099257562

从中我可以通过调用它来选择我想要的值;

$nMessage_id = $ResponseBody.message_id;

通常,这工作正常,我将值输入我的第二个变量;

$nMessage_id = 9093813071099257562

问题是:有时我在$ nMessage_id中什么也得不到,即使$ whatStatusJsonContent肯定会记录为从函数中正确返回Json。

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

提问于
用户回答回答于

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

ConvertFrom-Json应按预期工作,并返回带有.message_id属性的[pscustomobject]实例。

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

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

在后续评论中,您声明:

该例程每小时进行1000次以上的调用,对于大多数人来说,Json返回并且$ nMessage_id完美地生成。然后,突然,$ nMessage_id是空的,即使Json被记录为返回正常。因此,在ConvertFrom-Json或$ ResponseBody.message_id中的某个地方,值将丢失...

我没有解释,但如果 - 无论出于何种原因 - ConvertFrom-Json是罪魁祸首,您可以使用字符串操作作为解决方法来提取消息ID并查看是否有帮助:

$ whatStatusJsonContent ='{“message_id”:9093813071099257562}'

#将message_id属性值解压缩为* string *

#(如果需要,可以转换为数字类型)。

$ message_id =($ whatStatusJsonContent -split'[:}]')[1]

以上内容在$ message_id中存储内容为9093813071099257562的字符串;请注意,如上所述,输入字符串必须具有与空白相关的上述格式;虽然可以使文本解析更加健壮,但不必担心格式变化是使用像ConvertFrom-Json这样的专用解析器的一个很好的理由。

用户回答回答于

您将不得不转换它,以便PowerShell可以理解它。它将从字符串转换为PSCustomObject。只需通过询问前后变量的类型进行检查。

$ResponseBody.message_id.GetType()

如果有时输出什么都没有,你可以这样做:

if($ResponseBody.message_id){
    $nMessage_id = $ResponseBody.message_id
}else{
    throw "No message id found"
}

希望这可以帮助。

扫码关注云+社区

领取腾讯云代金券