Извлечение Значений Из Необработанного JSON С Помощью Powershell

#json #powershell

Вопрос:

Я создал сценарий PowerShell для возврата значений из веб-URL с данными JSON.

Мой скрипт теперь возвращает HTML с некоторыми данными JSON.

Теперь я хочу получить значение из данных JSON, содержащихся в этом HTML.

В частности, значение для ‘ID.ad_user’, где объявлена переменная данных («данные var = «).

Итак, «345345-3453-gfdd-44334» — это значение, которое мне нужно (исключая текст «ad_user://»).

Вот мой код PowerShell:

 $cred = "[my unique token]" $headers = @{ Authorization = "Bearer $cred" }  $Output = Invoke-RestMethod `  -Method Get `  -Headers $headers `  -ContentType: "application/json; charset=utf-8" `  -Uri "[my URL]"  $Output  

Вот вывод HTML и JSON:

 lt;!DOCTYPE htmlgt; lt;!-- If you are reading this, there is a good chance you would prefer sending an "Accept: application/json" header and receiving actual JSON responses. --gt; lt;link rel="stylesheet" type="text/css" href="/ui.min.css" /gt; lt;script src="/ui.min.js"gt;lt;/scriptgt; lt;scriptgt; var user = "admin"; var curlUser='[HIDDEN]'; var data = {"name": "Pat McKinnon","ID": ["ad_user://345345-3453-gfdd-44334","local://p-345dd455"],"state": "active",} lt;/scriptgt;  

Комментарии:

1. «Вот вывод JSON» — это не JSON, это HTML…

2. @Матиас Р. Джессен — ты прав. Я должен был сказать, что вывод HTML с данными JSON, содержащимися внутри. Позвольте мне обновить это.

3. Вы видели комментарий в реальном HTML-коде? If you are reading this, there is a good chance you would prefer sending an "Accept: application/json" header and receiving actual JSON responses. Так почему бы не сделать это, получив не HTML-код со встроенным JSON, а просто ответ JSON, который вы можете использовать ConvertFrom-Json .

4. спасибо, Тео. Как бы я реализовал преобразование из-Json в свой код? Можете ли вы поделиться примером?

5. Вероятно, добавив это в хэш-таблицу заголовков: $headers = @{ Authorization = "Bearer $cred"; Accept = "application/json" } . Тогда посмотрите, что $Output будет после Invoke-RestMethod . Если это действительно JSON, вы можете просто сделать $Output | ConvertFrom-Json и проложить свой путь оттуда

Ответ №1:

Может быть, это сработает. Найдите часть строки, содержащую данные JSON, а затем преобразуйте ее в объект.

 $result = $Output | Select-String -Pattern "var data = {. }`n" $lineWithData = $result.Matches.Value $lineWithData $json = $lineWithData.Substring('var data = '.Length) $json $dataObject = $json | ConvertFrom-Json $dataObject  

Затем вы можете получить свойство ID от объекта.

 $dataObject.ID ad_user://345345-3453-gfdd-44334 local://p-345dd455```  

Комментарии:

1. При запуске я получаю следующую ошибку: «‘ Вы не можете вызвать метод для выражения с нулевым значением. В строке:12 символ:1 $json = $Строка с данными.Подстрока(‘данные var = ‘.Длина) «‘

2. Похоже $Output , переменная не содержит строки с ожидаемым шаблоном, что приводит к нулевому совпадению, и поэтому переменная $lineWithData равна нулю.