В вашем коде нет ничего плохого.
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]
выбрано.
В последующем комментарии вы заявляете:
Подпрограмма совершает более 1000 вызовов / час, и для большинства из них Json возвращается и$nMessage_id
получается отлично.Затем, внезапно, $nMessage_id
становится пустым, хотя Json регистрируется как возвращающийся в порядке.Итак, где-то в ConvertFrom-Json
или $ResponseBody.message_id
значение пропадает ...
У меня нет объяснения, но если - по какой-то причине - ConvertFrom-Json
является виновником, вы можете попробуйте манипулирование строкой в качестве временного решения , чтобы извлечь идентификатор сообщения и посмотреть, поможет ли это:
$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 - это выдающийся анализатор JSON в мире .NET (который теперь лежит в основе командлетов JSON в PowerShell Core ):
$whatStatusJsonContent = '{"message_id":9093813071099257562}'
$message_id = [NewtonSoft.Json.Linq.JObject]::Parse($whatStatusJsonContent).message_id.Value
Примечание: Json.NET - как ConvetFrom-Json
в PowerShell _Core - также рекомендуется использовать произвольно большой тип [bigint]
, если число слишком велико, чтобы поместиться в [long]
.
Использование сборки Json.NET имеетдобавленное преимущество лучшая производительность , чем командлет ConvertFrom-Json
.
В PowerShell Core вы можете запустить приведенный выше код как есть (сборка предварительно загружена);в Windows PowerShell вам нужно будет загрузить пакет по приведенной выше ссылке и добавить сборку (NewtonSoft.Json.dll
) в сеанс с помощью Add-Type -LiteralPath
.
[1] Любопытно, что вPowerShell Core , начиная с (как минимум) v6.2.0, наименьший выбранный тип - [long]
(System.Int64
).
[2]PowerShell Core , начиная с (по крайней мере) v6.2.0, создает произвольно большой экземпляр [bigint]
(System.Numerics.BigInteger
), если значение больше не вписывается в [long]
;то есть тип [decimal]
вообще пропускается.