簡體   English   中英

Perl LWP::UserAgent 解析響應 JSON

[英]Perl LWP::UserAgent parse response JSON

我正在使用LWP::UserAgent模塊向我們的 API 之一發出 GET 請求。

#!/usr/bin/perl
use strict;
use warning;
use LWP::UserAgent;
use Data::Dumper;

my $ua = LWP::UserAgent->new;
my $request = $ua->get("http://example.com/foo", Authorization => "Bearer abc123", Accept => "application/json" );

print Dumper $request->content;

請求成功。 Dumper 返回以下 JSON。

$VAR1 = '{
          "apiVersion": "v1",
          "data": {
              "ca-bundle.crt": "-----BEGIN CERTIFICATE-----abc123-----END CERTIFICATE-----\\n"
          },
          "kind": "ConfigMap",
          "metadata": {
              "creationTimestamp": "2021-07-16T17:13:01Z",
              "labels": {
                  "auth.openshift.io/managed-certificate-type": "ca-bundle"
              },
              "managedFields": [
                  {
                      "apiVersion": "v1",
                      "fieldsType": "FieldsV1",
                      "fieldsV1": {
                          "f:data": {
                              ".": {},
                              "f:ca-bundle.crt": {}
                          },
                          "f:metadata": {
                              "f:labels": {
                                  ".": {},
                                  "f:auth.openshift.io/managed-certificate-type": {}
                              }
                          }
                      },
                      "manager": "cluster-kube-apiserver-operator",
                      "operation": "Update",
                      "time": "2021-09-14T17:07:39Z"
                  }
              ],
              "name": "kube-control-plane-signer-ca",
              "namespace": "openshift-kube-apiserver-operator",
              "resourceVersion": "65461225",
              "selfLink": "/api/v1/namespaces/openshift-kube-apiserver-operator/configmaps/kube-control-plane-signer-ca",
              "uid": "f9aea067-1234-5678-9101-9d4073f5ae53"
          }
      }';

假設我想打印 apiVersion 鍵的值,它應該打印v1

print "API Version = $request->content->{'apiVersion'} \n";

正在打印以下內容。 我不確定如何打印值v1 由於 HTTP::Response 包含在輸出中,我懷疑我可能必須使用HTTP::Response 模塊

API Version = HTTP::Response=HASH(0x2dffe80)->content->{'apiVersion'}

必須首先解碼 JSON 內容。 有幾個模塊,比如JSON

use JSON;
# ...
my $href = decode_json $request->content;

然后像普通的哈希引用一樣使用它: $href->{apiVersion}

Perl 不會在雙引號字符串中擴展子例程調用。

 print "API Version = $request->content->{'apiVersion'} \\n";

在這行代碼中, content()是一個子程序調用。 所以 Perl 認為:

print "API Version = $request" . "->content->{'apiVersion'} \n";

如果您嘗試打印大多數 Perl 對象,您將獲得散列引用以及類的名稱 - 因此HTTP::Response=HASH(0x2dffe80)

你可能認為你只需要像這樣分解你的print()語句:

print 'API Version = ', $request->content->{'apiVersion'}, "\n";

但這也行不通。 $request->content不返回 Perl 數據結構,它返回一個 JSON 編碼的字符串。 您需要先將其解碼為數據結構,然后才能訪問各個元素。

use JSON;

print 'API Version = ', decode_json($request->content)->{'apiVersion'}, "\n";

但是在print()語句之外進行解碼可能會更清晰。

use JSON;

my $data = decode_json($request->content);

在這種情況下,您可以返回更像原始代碼的內容:

print "API Version = $data->{'apiVersion'} \n";

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM