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;
请求成功。翻车机 returns 以下 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 module?
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 对象,您将获得散列引用以及 class 的名称 - 因此 HTTP::Response=HASH(0x2dffe80)
.
您可能认为您只需要像这样分解您的 print()
语句:
print 'API Version = ', $request->content->{'apiVersion'}, "\n";
但这也行不通。 $request->content
不是 return Perl 数据结构,它 return 是一个 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";
我正在使用 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;
请求成功。翻车机 returns 以下 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 module?
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 对象,您将获得散列引用以及 class 的名称 - 因此 HTTP::Response=HASH(0x2dffe80)
.
您可能认为您只需要像这样分解您的 print()
语句:
print 'API Version = ', $request->content->{'apiVersion'}, "\n";
但这也行不通。 $request->content
不是 return Perl 数据结构,它 return 是一个 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";